如何从内存中删除sqlalchemy映射对象



我很抱歉未提供示例代码。但是我无法在自己的代码之外复制它。

i具有对话对象( wx.Dialog),该对象具有sqlalchemy-mapped对象的 list

对话框关闭并销毁正确。我用调试代码,id()__del__()

检查了一下。

但是,当我再次打开对话框(在主窗口中按下相关按钮)时,SQLalchemy映射对象的相同实例仍在list中。对话框对象是RAM中的新事物,但其数据对象的列表与第一个对话框实例相同。我很困惑。

目前,我在对话框的__del__()中调用self._datalist.clear()。然后它起作用。

但我不确定为什么会发生这种情况,如果我的解决方案优雅?

在python中,您不会"删除"使它们消失的东西,而且您几乎永远不想将__del__()用于大部分内容;Python是一种收集的垃圾语言,您只是"忘记"对象,它们最终将被释放。

您最有可能遇到的问题是,尽管您自己的代码忘记了对象本身,但您从您检索到的sqlalchemy session()对象并没有忘记它们。实际上,这是session的确切内容,当从具有相同主要钥匙值的数据库中检索两个行时,它们成为Python中的相同对象。

您很可能想在工作单元之间处置整个会话(例如,以"保存"结尾的用户交互)。为此,您可以使用session.close()。之后,您可以继续使用会话;需要在需要时开始新的交易,或以相同的方式获得新的会话。

如果您确实需要管理每个对象的对象寿命,则可以使用session.expunge(),但是只有当您对会话真正为您所做的事情有很好的了解时,只有这样做。一个很好的起点是文档中的State Management章节:

相关内容

  • 没有找到相关文章

最新更新