【问题标题】:Parent instance is not bound to a Session; lazy load operation of attribute ’account’ cannot proceed父实例未绑定到 Session;属性“帐户”的延迟加载操作无法继续
【发布时间】:2019-08-09 16:31:22
【问题描述】:

在尝试执行以下操作时:

for line in blines:
    line.account = get_customer(line.AccountCode)

我在尝试为 line.account 赋值时遇到错误:

DetachedInstanceError: Parent instance <SunLedgerA at 0x16eda4d0> is not bound to a       Session; lazy load operation of attribute 'account' cannot proceed

我是不是做错了什么?

【问题讨论】:

标签: python sqlalchemy


【解决方案1】:

“分离”意味着您正在处理一个与Session 无关的 ORM 对象。 Session 是关系数据库的网关,所以每当您引用映射对象上的属性时,ORM 有时需要返回数据库以获取该属性的当前值。一般来说,您应该只使用“附加”对象 - “分离”是一种临时状态,用于缓存和在会话之间移动对象。

请参阅Quickie Intro to Object States,然后可能也阅读该文档的其余部分;)。

【讨论】:

  • 事实证明,我得到DetachedInstanceError 的情况是因为会话不能以并发方式使用——该异常被同步调用 celery 任务的事实触发了。跨度>
  • 那么@Devy 你的解决方案是什么?我想我正在为一段超长运行的代码生成一个类似的后台线程问题。
  • @mcpeterson 我的解决方案是避免以并发方式使用session,因为它不是线程安全的。见docs.sqlalchemy.org/en/latest/orm/…
【解决方案2】:

我对 Celery 也有同样的问题。将lazy='subquery' 添加到关系中解决了我的问题。

【讨论】:

  • 你能多说一些吗?您是否将其添加到您的关系的 &lt;relationshipname&gt; = &lt;databasename&gt;.relationship(&lt;other model name&gt;,back_populates="&lt;other model's relationship&gt;") 定义中?
  • 需要更多信息,我在 Celery 中遇到了同样的问题。我创建了 create_scoped_session 但在另一个模型对象类访问时遇到了上述问题(this.column)
【解决方案3】:

我在过早关闭查询会话时遇到了这种类型的DetachedInstanceError(也就是说,在会话关闭后有代码来处理那些 SQLAlchemy 模型对象)。因此,在您绝对不需要与模型对象(即 I.E.)交互之前,这是仔细检查没有会话关闭的一条线索。一些延迟加载的模型属性等。

【讨论】:

    【解决方案4】:

    我在单元测试时遇到了同样的问题。

    解决方案是在“with”上下文中调用所有内容:

    with self.app.test_client() as c:
        res = c.post('my_url/test', data=XYZ, content_type='application/json')
    

    然后它起作用了。

    添加惰性属性对我不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 2019-10-13
      相关资源
      最近更新 更多