如何使用tzlocal()将日期时间保存到MariaDB中?

时间:2017-12-01 23:59:46

标签: python mysql datetime sqlalchemy mariadb

我来自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)

0 个答案:

没有答案