我来自Postgres背景,是MariaDB(MySQL)的新手。
尝试将DateTime保存到MariaDB时,我收到此错误。
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)]
根据文档,如果我使用TIMESTAMP字段而不是DateTime,我应该绕过它。但这也无济于事。
MySQL将TIMESTAMP值从当前时区转换为UTC 存储,并从UTC返回到当前时区进行检索。 (对于其他类型,例如DATETIME,不会出现这种情况。)
问题是此日期'2017-11-25 16:33:26+00:00'
,其显示如下:FakeDatetime(2017, 11, 25, 16, 33, 26, tzinfo=tzlocal())
虚假数据来自Python中的@freeze_time("2017-10-25")
,在此上下文中无关紧要。
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)