Types SQL炼金术-使用TypeDecorator进行模式提取

Types SQL炼金术-使用TypeDecorator进行模式提取,types,sqlalchemy,decorator,database-schema,getter,Types,Sqlalchemy,Decorator,Database Schema,Getter,我使用一个TypeDecorator进行Json提取,另一个模型将它用于它的一个列。我使用这个TypeDecorator存储python列表对象 def process_bind_param(self, value, dialect): # etc... def process_result_value(self, value, dialect): # THIS NEVER GETS CALLED!! if value is not None: retu

我使用一个TypeDecorator进行Json提取,另一个模型将它用于它的一个列。我使用这个TypeDecorator存储python列表对象

def process_bind_param(self, value, dialect):
    # etc...

def process_result_value(self, value, dialect):
    # THIS NEVER GETS CALLED!!
    if value is not None:
        return json.loads(value)
    return value
当我在使用decorator绑定的模型中存储数据时,会适当地调用param。 现在,我使用TypeDecorator通过以下方式从模型中提取模式:

table = Table(table_name, meta, autoload=True, autoload_with=sengine)
table = Table(table_name, meta, Column(column_name, custom_type_Decorator), autoload=True, autoload_with=sengine)
现在进行查询测试(有许多方法可以循环和提取):


问题是,在查询表、提取对象和列时,没有调用process\u result\u value()。我假设SQLAlchemy反射处理依赖关系?我是否缺少构造函数中的一些选项来传输需要自定义类型装饰器的元数据?

我通过实验找到的解决方案

显然,在模式提取的Table()构造函数中,自定义TypeDecorator不会发生类型强制。要解决此问题,请执行以下操作:

table = Table(table_name, meta, autoload=True, autoload_with=sengine)
table = Table(table_name, meta, Column(column_name, custom_type_Decorator), autoload=True, autoload_with=sengine)
这是不幸的,因为我认为反射会在其中一列中发现这种依赖性


不知道为什么几天后没有得到答复。我猜新会员在按照stackoverflow使用的游戏化规则提问时处于劣势。

我不确定这是否是同一个问题,但我认为这足够相关,我可以在这里写下答案

存储对象并尝试读取属性后,不会调用函数process_result_value,因为该对象已缓存。(在这里发现)

因此,解决方法就是使对象无效

session.expire(obj)

另一方面,我可能会转而使用pickle模型而不是json来存储python列表,因为我的应用程序并不特别需要json对象。我在这里找到的sqlalchemy的pickle数据类型-->不管怎样,问题仍然是在使用Table()构造函数提取架构并执行查询测试后,getter函数(即process_result_value)没有被调用。无论是json还是pickle,问题仍然存在。