programing

tzlocal()을 사용하여 datetime을 MariaDB에 저장하는 방법

shortcode 2022. 10. 5. 21:24
반응형

tzlocal()을 사용하여 datetime을 MariaDB에 저장하는 방법

저는 Postgres 출신이며 MariaDB(MySQL)를 처음 접합니다.

MariaDB에 DateTime을 저장하려고 하면 이 오류가 나타납니다.

sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (1292, "Incorrect datetime value: '2017-11-25 16:33:26+00:00' for column 'expires_at' at row 1") [SQL: 'INSERT INTO user (username, password, created_at, expires_at, expires_at_ms) VALUES (%s, %s, %s, %s, %s)'] [parameters: ('uuid1', '...', FakeDatetime(2017, 10, 25, 0, 0), FakeDatetime(2017, 11, 25, 16, 33, 26, tzinfo=tzlocal()), 0)]

문서상으로는 Date Time이 아닌 TIMESTAMP 필드를 사용하면 회피할 수 있습니다.하지만 이것 역시 도움이 되지 않았다.

MySQL은 TIMESTAMP 값을 현재 시간대에서 UTC로 변환하여 저장하고 UTC에서 현재 시간대로 되돌립니다.(이것은 DATETIME 등의 다른 타입에서는 발생하지 않습니다).

문제는 이 날짜입니다.'2017-11-25 16:33:26+00:00'다음과 같이 표시됩니다.FakeDatetime(2017, 11, 25, 16, 33, 26, tzinfo=tzlocal())

가짜 데이터는@freeze_time("2017-10-25")Python에서는 문제가 되지 않습니다.

SqlAlchemy 모델:

class User(db.Model):
    __tablename__ = 'user'

    username = db.Column(db.String(36), primary_key=True)
    password = db.Column(db.String(100))
    created_at = db.Column(db.TIMESTAMP())
    expires_at = db.Column(db.TIMESTAMP())
    expires_at_ms = db.Column(db.BigInteger())

상세 분석:

from dateutil import parser as dt_parser
expires_at = dt_parser.parse('Sat, 25 Nov 2017 16:33:26 GMT')

MySQL이 tzinfo를 좋아하지 않기 때문에 실패합니다. datetime.datetime(2017, 11, 25, 16, 33, 26, tzinfo=tzlocal())

그렇지만expires_at = datetime.datetime.now()동작합니다.MySQL에서는 이 기능이 허용되기 때문입니다.datetime.datetime(2017, 12, 2, 9, 44, 55, 392927)

언급URL : https://stackoverflow.com/questions/47603148/how-to-save-datetime-with-tzlocal-into-mariadb

반응형