【问题标题】:Storing sqlalchemy mapped objects in cache将 sqlalchemy 映射的对象存储在缓存中
【发布时间】: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


    【解决方案1】:

    问题已通过禁用每个会话的自动刷新和自动提交来解决。因此,只读会话从不发送任何修改查询,而读写会话只发送显式更改的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 2021-09-27
      • 2022-10-22
      • 1970-01-01
      • 2012-07-05
      相关资源
      最近更新 更多