【发布时间】:2015-03-25 00:38:12
【问题描述】:
我有一些环境非常古老的 python (2.5) 和相应的库 (例如 sqlalchemy 0.5.2)。 我的项目中有一些炼金术模型。我经常选择它们,很少更新。所以我有两个引擎,一个用于主控,另一个用于从属。我的模型有方法 save(self, session),我用它来存储数据库中的更改。
其他代码通过主键从 db 中选择对象,在每个 pk 上检查它是否在缓存中映射了对象,如果没有,它通过 s.query 方法从 db 中选择行,pickles 映射对象并放入缓存(memcache in我的情况,但没关系)。如果它已经在缓存中,只需将其从缓存中取出,执行 session.merge 并返回。 每次 self.save 调用后,我都会使当前实例的缓存无效并进行一次选择以预缓存它,因此我始终在缓存中拥有实际对象。
如果我没有进行 session.merge 调用,如果我会在另一个进程中(或在此进程中重新启动后)从缓存中获取对象,每个属性解析都会出现异常:
/var/lib/python-support/python2.5/sqlalchemy/orm/attributes.py in __get__(self, instance, owner)
157 if instance is None:
158 return self
--> 159 return self.impl.get(instance_state(instance))
160
161 class _ProxyImpl(object):
但是使用 session.merge 会导致更新查询,这完全否定了使用 memcache - 只是我更新而不是选择。当我使用绑定到只读引擎的会话时,它失败了。
我应该如何在序列化状态下正确存储 SqlAlchemy orm 映射对象,而不引用存储 - memcache、基于文件、in-ram 等 - 并且不对 db 进行额外的更新查询?
【问题讨论】:
标签: python mysql session caching sqlalchemy