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

时间:2015-05-04 02:52:23

标签: python sqlalchemy

我很抱歉没有提供示例代码。但我无法在我自己的代码之外重现这一点。

我有一个对话框对象(wx.Dialog),其中包含list sqlalchemy映射对象。

对话框已关闭并被破坏正确。我使用调试代码id()__del__()检查了这一点。

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

目前,我在对话框的self._datalist.clear()中致电__del__()。然后就行了。

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

1 个答案:

答案 0 :(得分:0)

在python中,你没有“删除”东西以使它们消失,而你几乎从不想在任何事情上使用__del__(); python是一种垃圾收集语言,你只是“忘记”对象,它们最终将被释放。

您最有可能遇到的问题是,当您自己的代码忘记了对象本身时,您从中检索到的SQLAlchemy session()对象并没有忘记它们。实际上,这是session的精确之处,当使用相同的主键值从数据库中检索两行时,它们将成为python中的同一对象。

您很可能希望处理逻辑工作单元之间的整个会话(例如,以“保存”结尾的用户交互)。为此,您可以使用session.close()。之后,您可以继续使用会话;新事务将在需要时启动,或以与获得第一个事务相同的方式获得新会话。

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