在解析/修改别人代码的过程中,同步脚本时同步依赖实体(Person-Child)时出现错误。显然,出现了这样一种情况,它session.add(person)试图将先前被同步器删除的 orm-Child 对象添加到数据库中:
session.add(person)
File "/home/web/portal/env/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 1559, in add
self._save_or_update_state(state)
File "/home/web/portal/env/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 1578, in _save_or_update_state
self._save_or_update_impl(st_)
File "/home/web/portal/env/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 1828, in _save_or_update_impl
self._update_impl(state)
File "/home/web/portal/env/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 1814, in _update_impl
state_str(state)
InvalidRequestError: Instance '<Child at 0xec10afec>' has been deleted. Use the make_transient() function to send this object back to the transient state.
标记一个对象是什么意思
make_transient()——在这样的上下文中应该如何以及为什么要使用它?在代码过程中,还使用了另一种单次请求删除对象的策略:through
.delete()。问题是在此类请求中提供什么以及何时使用标志synchronize_session?
session.query(Child).filter(Child.id==child.id).delete(synchronize_session=False)
该命令
session.query(Child).delete()不仅会Child从数据库中删除对象对应的记录,还会在会话中更新这些对象的状态。当然,这些额外的步骤需要时间,并且会相应地减慢删除过程。如果您确定您将不再访问这些对象,那么您就不需要更新它们的状态。这就是它的用途synchronize_session=False。但是从你所犯的错误来看,你还是求助于他们。synchronize_session因此,从中删除参数delete()并检查是否出现问题。