尝试执行以下操作时:
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
我做错了吗?
答案 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')
然后它起作用了。
添加惰性属性对我不起作用。