所以我有一个模型Event
,我想创建一个名为column_property
的{{1}},它应该是时区中的start_time_local
,存储在datetime
列中timezone_name
1}}当然,UTC中的日期时间存储在start_time
。
所以,如果,
start_time is datetime(2014, 12, 3, 10, 00)
和
timezone_name is u'Europe/Helsinki'
然后,
start_time_local
应为datetime(2014, 12, 3, 12, 00)
当然,在SQL中,这可以通过执行以下操作来实现:
start_time::timestamptz AT TIME ZONE timezone_name
虽然在SQLAlchemy的情况下,我不知道如何通过column_property
或hybrid_property
的表达式提供此功能。我尝试使用literal_column
将其作为原始SQL执行,并且没有解决,因为它发出了错误消息,说它无法找到列start_time
和{{1}当他们确实存在时。所以我认为这在这里并不是很有用。我也尝试找到任何功能,但所有与时间和时区相关的功能似乎只在UTC和系统时间之间进行转换,这对我来说并不是很有用。
如何做到这一点?
答案 0 :(得分:0)
您应该可以使用literal_column
实现此目的。您只需确保使用完整的列名称(例如events.timezone_name
)并标记literal_column
。
这是一个(未经测试的)示例:
class Event(Base):
__tablename__ = 'events'
start_time = ...
timezone_name = ...
start_time_local = column_property(
literal_column("""
events.start_time::timestamptz AT TIME ZONE events.timezone_name
"""), type_=DateTime).label('start_time_local')
)