我有一些这样定义的SQLAlchemy模型:
class TimeData(object):
__table_args__ = {"extend_existing": True}
created_on = Column(DateTime(timezone=True),server_default=db.func.now())
updated_on = Column(
DateTime(timezone=True),server_default=db.func.now(),server_onupdate=db.func.now(),onupdate=db.func.now(),)
class Article(db.Model,TimeData):
id = Column(db.Integar,primary_key=True)
title = Column(db.Text)
contents = Column(db.Text)
last_reviewed_on = Column(db.DateTime)
class Review(db.Model,TimeData):
id = Column(db.Integer,primary_key=True)
review = Column(db.Text)
rating = Column(db.Integer)
read_on = Column(db.DateTime)
正如人们所看到的那样,从DateTime
类继承的TimeData
对象用timezone=True
标记,而模型本身中定义的日期则没有。序列化时会产生两种不同类型的日期字符串。
created_on
被序列化为类似2019-11-25T01:53:05.576Z
的末尾为Z,而read_on
之类的值被序列化为2019-11-25T01:53:05.576
而没有Z。由于我们存储了所有内容在UTC中,数据库中的日期信息很好。但是,当浏览器评估日期时,序列化的输出在客户端引起问题。带有Z的表示为UTC,而没有Z的表示为本地时间。
作为解决方案,迁移模型似乎不起作用。将timezone=True
添加到模型后,flask-Migrate(Alembic)不会检测到模型中的任何更改。
如何使用TimeZone将日期迁移到那些日期?