SQLAlchemy DateTime对象只能天真吗?

Bri*_*ell 25 python datetime sqlalchemy

我正在使用SQLAlchemy,我还不确定我将使用哪个数据库,因此我希望尽可能保持与数据库无关.如何在不将自己绑定到特定数据库的情况下将时区感知日期时间对象存储在数据库中?现在,我确定时间是UTC,然后我将它们存储在数据库中,并在显示时转换为本地化,但感觉不够优雅和脆弱.是否有一种与数据库无关的方法来从SQLAlchemy中获取时区感知日期时间而不是从数据库中获取天真的数据时间对象?

Den*_*ach 43

列时间有一个timezone参数DateTime,因此存储时区感知datetime对象没有问题.但是我发现datetime使用简单类型装饰器自动将存储转换为UTC 很方便:

from sqlalchemy import types
from dateutil.tz import tzutc
from datetime import datetime

class UTCDateTime(types.TypeDecorator):

    impl = types.DateTime

    def process_bind_param(self, value, engine):
        if value is not None:
            return value.astimezone(tzutc())

    def process_result_value(self, value, engine):
        if value is not None:
            return datetime(value.year, value.month, value.day,
                            value.hour, value.minute, value.second,
                            value.microsecond, tzinfo=tzutc())
Run Code Online (Sandbox Code Playgroud)

请注意,当您datetime意外使用naive时,这表现得很好(意味着它会引发ValueError).

  • @Jesse Dhillon:它是故意防止意外存储天真的日期时间对象,而你的配方错误地将任何时区的任何时区都解释为UTC. (11认同)
  • @ Dennis,所以使用你的类型,一个人应该只创建和存储时区感知的`datetime`对象?现在我明白了,我更喜欢你的解决方案,因为它要求用户明确他们正在保存的内容. (6认同)
  • 我是否正确认为最后一点,它创建日期时间,相当于`value.replace(tzinfo = tzutc())`,如下所示:http://mindlace.net/2012/11/13/ make-datetime-naive-for-mysql-in-sqlalchemy /?或者做一些略有不同的事情?我害怕在这里弄错了! (4认同)