gpt4 book ai didi

python - 分离 SQLAlchemy 实例,因此不会发生刷新

转载 作者:太空狗 更新时间:2023-10-29 17:41:32 26 4
gpt4 key购买 nike

我想从我的 session 中分离一个类的实例,但它应该仍然可供读取(无需发出查询)。几天来我一直在浏览文档,但我尝试的每一种方法都会导致消息

DetachedInstanceError: Instance <MyModel at 0x36bb190> is not bound to a Session;
attribute refresh operation cannot proceed

我正在使用 Pyramid 中的 zope.sqlalchemy 事务管理器。我希望我的对象在事务提交后 可用。我只需要它来读取“缓存”值,即在事务提交之前已经存在的值。

我能找到的唯一可能的解决方案是包装类(或属性本身),然后手动跟踪更改(我可以这样做,但它真的很难看,根本不是 Pythonic)。

有没有办法阻止 SQLAlchemy 尝试刷新这些值?

作为回退,我什至愿意只返回None,只要在事务提交后没有抛出上述错误

最佳答案

您可以通过以下方式做到这一点(例如缓存):

session.expunge(obj)

根据 sqlalchemy 文档:

http://docs.sqlalchemy.org/en/rel_1_0/orm/session_api.html?highlight=expire#sqlalchemy.orm.session.Session.expunge

这将为您提供处于分离状态的对象,您可以安全地使用它 - 您需要记住,您将无法读取会发出另一个查询的属性,因此被绑定(bind)到 session - 就像关系一样,这将以DetachedInstanceError

默认情况下,提交将发出一个 expire_all(),这意味着所有对象都将在读取时刷新它们的状态,通过删除它们,您将它们从 session 中分离出来,因此在您提交事务后应该没有后续查询。

我建议不要在全局范围内禁用此功能,正如其他评论所建议的那样,因为 Mike Bayer 通常认为这对大多数人来说是一个好主意和明智的默认设置,从长远来看可以让您省去麻烦。

只需在需要时明确删除即可。

关于python - 分离 SQLAlchemy 实例,因此不会发生刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15397680/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com