3

我正在使用 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

当我在使用装饰器的模型中存储数据时,会适当地调用 bind_param。现在,我使用 TypeDecorator 通过以下方式从模型中提取模式:

table = Table(table_name, meta, autoload=True, autoload_with=sengine)

现在进行查询测试(有很多方法可以循环和提取):

for record in source.query(table).all():
   print type(record.column_using_custom_type_list_object) == str
   # returns true ... this should be false ... should be of type list
   # json.loads() returns type list ???
   print record.column_using_custom_type_list_object[some_index] 
   # naturally this prints a character in the string, not a cell

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

4

2 回答 2

2

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

存储对象并尝试读取属性后,不会调用函数 process_result_value,因为该对象已被缓存。(发现这里http://comments.gmane.org/gmane.comp.python.sqlalchemy.user/11406

所以解决方案只是使对象无效。

session.expire(obj)

http://docs.sqlalchemy.org/en/rel_0_8/orm/session.html#refreshing-expiring

于 2013-09-20T17:39:46.977 回答
0

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

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

table = Table(table_name, meta, Column(column_name, custom_type_Decorator), autoload=True, autoload_with=sengine)

这是不幸的,因为我认为反射会在其中一列中找到这种依赖关系。

不知道为什么几天后没有回答。我猜新成员在根据 stackoverflow 使用的游戏化规则系统提问时处于劣势。

于 2013-08-12T15:30:01.223 回答