【发布时间】:2011-01-13 12:59:22
【问题描述】:
我使用 SqlAlchemy 连接到我的数据库后端,并在我的 Python 应用程序中大量使用多处理。我遇到了一种情况,需要将对象引用(数据库查询的结果)从一个进程传递到另一个进程。
这是一个问题,因为在访问对象的某个属性时,SqlAlchemy 尝试将该对象重新附加到另一个进程的当前会话中,但失败并出现异常,因为该对象附加在另一个会话中:
InvalidRequestError: Object '<Field at 0x9af3e4c>' is already attached to session '148848780' (this is '159831148')
如何处理这种情况?是否可以在没有 ORM 相关内容的情况下从第一个会话中分离对象或克隆对象?
【问题讨论】:
-
只是一个建议:您是否尝试过将对象合并到新会话中? sqlalchemy.org/docs/orm/session.html#merging
-
session.expunge(obj) 让 sqlalchemy 忘记了 obj。但是,如果您之后更改 obj,则更改不会再提交到数据库。 maksymko 的建议当然更好。
-
对象上的属性是另一个数据库存储的对象吗?例如,它是外键还是 blob?
-
''merge'' 对我来说看起来不错,我会试试这个。我只需要读取属性,它们是 int 和 str。
标签: python orm sqlalchemy multiprocessing