Python 如何使用tzlocal()将datetime保存到MariaDB中?
我来自博士后的背景,对MariaDB(MySQL)是个新手 当试图将日期时间保存到MariaDB中时,我遇到了这个错误Python 如何使用tzlocal()将datetime保存到MariaDB中?,python,mysql,datetime,sqlalchemy,mariadb,Python,Mysql,Datetime,Sqlalchemy,Mariadb,我来自博士后的背景,对MariaDB(MySQL)是个新手 当试图将日期时间保存到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
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)]
根据文档,如果使用时间戳字段而不是DateTime,我应该避开它。但这也没用
MySQL将时间戳值从当前时区转换为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')
进一步分析:
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\u at=datetime.datetime.now()
有效。因为这对于MySQL是可以接受的:datetime.datetime(2017、12、2、9、44、55、392927)
MySQL/MariaDB不处理+00:00
,也不处理GMT
。甚至时间戳类型都不处理?那么我必须转换它们吗?到底是怎么回事?