2015-10-17 48 views
1

我們成功實現了用戶定義的數據類型。實際上,本地化策略將可本地化的值保存到JSONB字段中,並添加LocalizedString類型,我們使用sqlAlchemy用戶定義的類型實現在postgresql函數的幫助下獲取/設置它們的值。查找在sqlalchemy用戶定義類型中發生的操作

class LocalizedString(JSONB): 

    def __init__(self): 
     super(LocalizedString, self).__init__() 


    def column_expression(self, colexpr): 
     locale_id = thread_locale[threading.current_thread().ident] 
     return func.delocalized(colexpr,locale_id) 

    def bind_expression(self, bindvalue): 
     locale_id = thread_locale[threading.current_thread().ident] 
     val = type_coerce(bindvalue, String) 
     return func.localized(locale_id, val) 

問題是,我必須找出在bind_expression中發生了哪些操作,以便在更新中添加以前的子項目。

{ '恩': '嘗試'}更新後 - > { '恩': '嘗試' 時間, 'fr': 'essayer'}

回答

1

最後,我結束了像before_update和after_update會話事件。其實我發現沒有直接或間接的方法來檢查當前的動作/命令。這是設計的,因爲運行bind_expression和column_expression的階段與命令創建階段不同。也就是說,你甚至不知道在這個階段可能產生哪個命令。因此,我在before_update中保存了一個上下文綁定變量,然後在需要時使用它。

@event.listens_for(Base, 'before_update', propagate=True) 
def receive_before_update(mapper, connection, target): 
    if type(col.type) == LocalizedString and threading.current_thread().ident in thread_data: 
     thread_data[threading.current_thread().ident].action = 'update' 
相關問題