<p>我对<code>DetachedInstanceError: Instance <> is not bound to a Session;</code>也有类似的问题</p>
<p>情况非常简单,我将会话和要更新的记录传递到我的函数中,它将合并记录并将其提交到数据库。在第一个示例中,我会得到错误,因为我很懒,认为我可以返回合并的对象,以便更新我的操作记录(即它的<code>is_modified</code>值将为false)。它确实返回了更新的记录,<code>is_modified</code>现在为false,但随后的使用抛出了错误。我认为这是因为相关的儿童记录,但不完全确定。</p>
<pre><code> def EditStaff(self, session, record):
try:
r = session.merge(record)
session.commit()
return r
except:
return False
</code></pre>
<p>经过大量的google和阅读sessions等内容,我意识到,由于我在提交之前捕获了实例r并将其返回,当同一条记录被发送回此函数进行另一次编辑/提交时,它已经丢失了会话。</p>
<p>为了解决这个问题,我只需查询数据库中刚刚更新的记录,并将其返回到session中,并将其<code>is_modified</code>值标记回false。</p>
<pre><code> def EditStaff(self, session, record):
try:
session.merge(record)
session.commit()
r = self.GetStaff(session, record)
return r
except:
return False
</code></pre>
<p>设置<code>expire_on_commit=False</code>也避免了上面提到的错误,但我认为它实际上并没有解决错误,而且可能会导致许多其他问题</p>