将sqlalchemy映射对象存储在缓存中

时间:2015-01-26 15:09:22

标签: python mysql session caching sqlalchemy

我有一些非常古老的python(2.5)和相应的库(例如sqlalchemy 0.5.2)。 我的项目中有一些炼金术模型。我经常选择它们,很少更新。所以我有两个引擎,一个是掌握,另一个是奴隶。我的模型有方法保存(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的额外更新查询?

1 个答案:

答案 0 :(得分:0)

通过为每个会话禁用autoflush和autocommit解决了问题。因此,只读会话永远不会发送任何修改查询,而读写会话只发送显式更改的行。