[python]避免SqlAlchemy的TypeError: can't compare offset-naive and offset-aware datetimes错误
SqlAlchemy的DateTime
字段有个问题,就是如果数据库本身不支持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时区的时间。