是否通过类的__del__方法关闭python 2.7.x中的sqlite3连接?

时间:2014-04-09 18:20:54

标签: python oop python-2.7 sqlite

我有一个类在它的__init__方法中打开一个SQLite数据库,我想稍后通过在创建的对象上使用内置del函数来关闭它。

我的析构函数看起来像这样:

def __del__(self):
    self.connector.close()

这是一种关闭数据库连接的安全方法吗?

2 个答案:

答案 0 :(得分:2)

不,如果在此对象仍处于活动状态时发生异常,则不会调用析构函数。 Check this other SO question.

如上所述,您应该将您的类更改为上下文管理器,以便可以在with语句中使用它。这可确保始终调用其__exit__方法。

您还可以查看contextlib module,这样可以更轻松地生成此类上下文管理器。

答案 1 :(得分:0)

是的,在__del__()方法中关闭连接是非常可疑的。何时以及是否调用该方法是垃圾收集器的决定。它可能永远不会被调用,或者在您建立与数据库的另一个连接之后才可能被调用。

您必须自己调用close()方法。我通常通过向我的连接包装类添加close()方法并确保使用try / finally调用它来执行此操作。

我发现至少有一个应用程序必须确保除了 close()commit()之外我还要调用rollback() 。完成连接。