我正在使用SQLAlchemy,但我不确定在该数据库下使用哪个数据库,因此我想尽可能地保持与数据库无关。如何在不将自己绑定到特定数据库的情况下在数据库中存储时区感知日期时间对象?现在,在将时间存储到数据库中之前,我要确保时间已是UTC,并在显示时将其转换为本地化的时间,但这确实很不灵活。有一种与数据库无关的方法可以从SQLAlchemy中获取时区感知的日期时间,而不是从数据库中获取朴素的数据时间对象吗?
列时间有一个timezone参数DateTime,因此存储时区感知datetime对象没有问题。但是我发现datetime使用简单的类型装饰器将存储的内容自动转换为UTC很方便:
timezone
DateTime
datetime
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)。