在Python 2.7.x中通过类的__del__方法关闭sqlite3连接是否可疑?

2 投票
2 回答
952 浏览
提问于 2025-04-18 02:05

我有一个类,在它的初始化方法(__init__)里打开了一个SQLite数据库,我想在稍后通过对创建的对象使用内置的删除(del)功能来关闭这个数据库。

我的析构函数(也就是用来清理资源的函数)是这样的:

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

这样关闭数据库连接是否安全呢?

2 个回答

0

是的,在 __del__() 方法里关闭连接是很不靠谱的。这个方法什么时候被调用,完全是垃圾回收器的决定。可能它根本不会被调用,或者在你已经建立了另一个数据库连接之后才会被调用。

你必须自己去调用 close() 方法。我通常会在我的连接包装类里添加一个 close() 方法,并确保它能通过 try / finally 结构被调用。

在至少一个应用中,我发现有必要在完成连接后,除了调用 commit()rollback() 之外,还要确保调用 close()

2

不,如果这个对象还在使用中,发生异常时,析构函数是不会被调用的。可以看看这个其他的SO问题。

正如那里提到的,你应该把你的类改成一个上下文管理器,这样就可以在with语句中使用。这能确保它的__exit__方法总是会被调用。

你还可以了解一下contextlib模块,这个模块可以让你更方便地创建这样的上下文管理器。

撰写回答