我使用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反射处理依赖关系?我是否缺少构造函数中的一些选项来传输需要自定义类型装饰器的元数据?
答案 0 :(得分: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
答案 1 :(得分:0)
我通过实验找到的解决方案。
显然,在用于模式提取类型的Table()构造函数中,自定义TypeDecorator不会发生强制。要解决此问题,请执行以下操作:
table = Table(table_name, meta, Column(column_name, custom_type_Decorator), autoload=True, autoload_with=sengine)
这很不幸,因为我认为反射会在其中一列中找到这种依赖关系。
不确定为什么几天后没有回答这个问题。我猜新成员在根据stackoverflow使用的游戏化规则提问时处于不利地位。