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
'programing' 카테고리의 다른 글
모든 호스트에서 MySQL 루트 액세스 (0) | 2022.10.05 |
---|---|
마리아 표의 여러 열을 업데이트하는 방법DB (0) | 2022.10.05 |
VueJS v-if = 어레이[인덱스]가 작동하지 않음 (0) | 2022.09.30 |
"X11 DISPLAY 변수 없음" - 무슨 뜻입니까? (0) | 2022.09.29 |
연결된 테이블에서 아이들의 총 레코드를 가져옵니다. (0) | 2022.09.29 |