SQLAlchemy DateTime对象只能天真吗?

发布于 2021-01-29 15:06:44

我正在使用SQLAlchemy,但我不确定在该数据库下使用哪个数据库,因此我想尽可能地保持与数据库无关。如何在不将自己绑定到特定数据库的情况下在数据库中存储时区感知日期时间对象?现在,在将时间存储到数据库中之前,我要确保时间已是UTC,并在显示时将其转换为本地化的时间,但这确实很不灵活。有一种与数据库无关的方法可以从SQLAlchemy中获取时区感知的日期时间,而不是从数据库中获取朴素的数据时间对象吗?

关注者
0
被浏览
90
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    from sqlalchemy import types
    from datetime import datetime, timezone
    
    class UTCDateTime(types.TypeDecorator):
    
        impl = types.DateTime
    
        def process_bind_param(self, value, engine):
            if value is None:
                return
            if value.utcoffset() is None:
                raise ValueError(
                    'Got naive datetime while timezone-aware is expected'
                )
            return value.astimezone(timezone.utc)
    
        def process_result_value(self, value, engine):
            if value is not None:
                return value.replace(tzinfo=timezone.utc)
    

    请注意,当您datetime偶然使用朴素时,这表现很好(这将引发ValueError)。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看