我有一个类在它的__init__方法中打开一个SQLite数据库,我想稍后通过在创建的对象上使用内置del函数来关闭它。
我的析构函数看起来像这样:
def __del__(self):
self.connector.close()
这是一种关闭数据库连接的安全方法吗?
答案 0 :(得分:2)
不,如果在此对象仍处于活动状态时发生异常,则不会调用析构函数。 Check this other SO question.
如上所述,您应该将您的类更改为上下文管理器,以便可以在with
语句中使用它。这可确保始终调用其__exit__
方法。
您还可以查看contextlib module,这样可以更轻松地生成此类上下文管理器。
答案 1 :(得分:0)
是的,在__del__()
方法中关闭连接是非常可疑的。何时以及是否调用该方法是垃圾收集器的决定。它可能永远不会被调用,或者在您建立与数据库的另一个连接之后才可能被调用。
您必须自己调用close()
方法。我通常通过向我的连接包装类添加close()
方法并确保使用try / finally
调用它来执行此操作。
我发现至少有一个应用程序必须确保除了 close()
或commit()
之外我还要调用rollback()
。完成连接。