Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用tzlocal()将datetime保存到MariaDB中?_Python_Mysql_Datetime_Sqlalchemy_Mariadb - Fatal编程技术网

Python 如何使用tzlocal()将datetime保存到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

我来自博士后的背景,对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 (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
。甚至时间戳类型都不处理?那么我必须转换它们吗?到底是怎么回事?