2014-12-03 48 views
2

所以我有一個模型Event,我想創建一個名爲column_propertystart_time_local應在時區的datetime存儲在列timezone_name當然在UTC日期時間存儲在start_time如何在sqlalchemy column_property中有一個原始的sql?

所以,如果 start_time is datetime(2014, 12, 3, 10, 00)timezone_name is u'Europe/Helsinki'然後, start_time_localdatetime(2014, 12, 3, 12, 00)

當然在SQL的好,這是有可能通過執行這樣的事情:在SQLAlchemy的情況下

start_time::timestamptz AT TIME ZONE timezone_name 

雖然我不知道如何通過column_propertyhybrid_property的表達式來實現。我嘗試使用literal_column作爲原始SQL執行此操作,但沒有成功,因爲它提供了一個錯誤消息,說明它們確實存在時找不到列start_timetimezone_name。所以我想這在這裏不是很有用。我也試圖找到任何功能,但所有那些與時間和時區相關的東西似乎只是在UTC和系統時間之間進行轉換,這對我來說並不是很有用。

這怎麼辦?

回答

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') 
    ) 
相關問題