查找sql​​alchemy用户定义类型中正在执行的操作

时间:2015-10-17 09:44:37

标签: python postgresql sqlalchemy

我们已成功实施用户定义的数据类型。事实上,有一个本地化策略可以将可本地化的值保存到JSONB字段中,并添加一个LocalizedString类型,我们使用sqlAlchemy用户定义的类型实现在postgresql函数的帮助下获取/设置它们的值。

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中正在进行的操作,以便在更新中添加以前的子项。

{'en':'尝试'}更新后 - > {'en':'试试','fr':'essayer'}

1 个答案:

答案 0 :(得分: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'