我正在开发一个使用 SQLAlchemy ORM 的多线程应用程序。它已经使用了以线程为作用域的scoped_session,但是当我们将 ORM 对象从工作线程传递回主线程时,我们遇到了一些问题。由于对象附加到工作线程的 session ,因此当工作线程关闭时,我们开始在这些对象上收到 DetachedInstanceErrors。
有没有一种方法可以让 ORM 对象根据需要将自己分离/重新附加到正确的 session ?每当我们有一个缓慢的操作,我们不想锁定我们的 UI 时,我们就会生成一个新线程,因此将重新附加代码放在我们生成新线程的任何地方都会很困惑。
我认为我们还需要能够在生成线程时克隆 ORM 对象,以便我们可以在主线程中拥有一个,在工作线程中拥有一个。我看到“合并”但没有“ split ”。这可能吗?
最佳答案
Session.merge()
就足够了,应该做你想做的事情,但即便如此,线程也会变得很麻烦。您可能需要重新考虑这一点。
将主键而不是对象传递给工作器,然后在工作器本身中处理对象加载和实际工作。不要乱搞线程和开放/封闭 session ,这最终会导致头痛。一旦工作人员可以单独处理对象,您甚至可以将工作人员移动到单独的进程(类似于 Celery 的做法)。
关于python - SQLAlchemy ORM : safely passing objects between threads without manually reattaching?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27193849/