如何在sqlalchemy column_property中使用原始sql?

时间:2014-12-03 11:38:46

标签: python postgresql datetime sqlalchemy timezone

所以我有一个模型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_propertyhybrid_property的表达式提供此功能。我尝试使用literal_column将其作为原始SQL执行,并且没有解决,因为它发出了错误消息,说它无法找到列start_time和{{1}当他们确实存在时。所以我认为这在这里并不是很有用。我也尝试找到任何功能,但所有与时间和时区相关的功能似乎只在UTC和系统时间之间进行转换,这对我来说并不是很有用。

如何做到这一点?

1 个答案:

答案 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')
    )