我们已成功实施用户定义的数据类型。事实上,有一个本地化策略可以将可本地化的值保存到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'}
答案 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'