SqlAlchemyDateTime字段有个问题,就是如果数据库本身不支持timezone,并且app中的datetime对象为timezone aware的话,向数据库中存储数据时会报告如下错误:

TypeError: can't compare offset-naive and offset-aware datetimes

虽然DateTime提供了timezone选项,但这个选项仅在数据库支持时区时才有效。对于常用的MySQL甚至SQLite,这个选项无能为力。

解决方法就是自定义一个timezone aware的数据类型(来源):

import pytz  # from PyPI

class AwareDateTime(db.TypeDecorator):
    '''Results returned as aware datetimes, not naive ones.
    '''

    impl = db.DateTime

    def process_result_value(self, value, dialect):
        return value.replace(tzinfo=pytz.utc)
      
      
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    last_access_time = db.Column(AwareDateTime)

这样timezone aware的时间就能正确存入数据库了。当然数据库并不知道它是timezone aware的(因为数据库不支持时区),它得到的只是一个UTC时区的时间。