jav*_*vex 12 python sqlalchemy pyramid
我想从我的会话中分离一个类的实例,但它仍然可以读取(不发出查询).我已经扫描了几天的文档,但我尝试的每一种方法都会导致这个消息
DetachedInstanceError: Instance <MyModel at 0x36bb190> is not bound to a Session;
attribute refresh operation cannot proceed
Run Code Online (Sandbox Code Playgroud)
我正在使用zope.sqlalchemyPyramid中的事务管理器.我希望在提交事务后我的对象可用.我只需要它来读取"缓存"值,即在提交事务之前在其中的值.
我能弄清楚的唯一方法是包装类(或属性本身),然后手动跟踪更改(我可以这样做,但它真的很难看,而且根本不是pythonic).
那么有什么方法可以阻止SQLAlchemy尝试刷新这些值?
作为一个后备,我甚至可以只返回None,只要在事务提交后没有抛出上述错误
jch*_*ysk 10
http://docs.sqlalchemy.org/en/latest/orm/session_api.html
我想你在找 expire_on_commit = False
我相信这允许你分离对象并继续使用它.试图修改它并提交然后将导致DetachedInstanceError.
您可以通过执行以下操作来完成此操作(例如,用于缓存):
session.expunge(obj)
Run Code Online (Sandbox Code Playgroud)
根据sqlalchemy文档:
这将为您提供可以安全使用的处于分离状态的对象 - 您需要记住,您将无法读取会发出另一个查询的属性,从而与会话相关联,这将最终结束DetachedInstanceError.
默认情况下,提交将发出expire_all(),这意味着所有对象将在读取时刷新其状态,方法是将它们与会话分离,以便在提交事务后不再有后续查询.
我建议不要在全球范围内禁用此功能,因为其他评论建议迈克拜耳一般认为这对于大多数人来说是一个好主意和理智的默认设置,可以帮助您长期避免头痛.
只在需要时明确地解决问题.
| 归档时间: |
|
| 查看次数: |
11653 次 |
| 最近记录: |