父实例未绑定到Session;属性“帐户”的延迟加载操作无法继续

时间:2012-12-20 07:19:48

标签: python sqlalchemy

尝试执行以下操作时:

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

我做错了吗?

4 个答案:

答案 0 :(得分:23)

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

参见Quickie Intro to Object States,然后可能也会阅读该文档的其余内容;)。

答案 1 :(得分:4)

我和芹菜有同样的问题。将lazy='subquery'添加到关系中解决了我的问题。

答案 2 :(得分:2)

当我提前关闭查询会话时,我遇到了这种类型的DetachedInstanceError(也就是说,在会话关闭后有代码处理那些SQLAlchemy模型对象)。因此,在您绝对不需要与模型对象进行交互之前,这是一个双重检查没有会话闭包的线索,I.E。一些Lazy Loaded模型属性等。

答案 3 :(得分:0)

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

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

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

然后它起作用了。

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