PyQt - 如何在类销毁时关闭数据库连接

2 投票
3 回答
1442 浏览
提问于 2025-04-17 10:21

如果我的类需要多次使用数据库(很多函数或属性都要用到数据库里的数据),那么最好的做法是什么呢?是一次性在类开始的时候建立一个数据库连接,然后在需要的时候多次使用,最后在退出时关闭这个连接(用全局变量);还是在每个属性里都建立、使用和关闭数据库连接(用局部变量)?

如果一次建立连接然后在类结束时关闭连接更好,我该怎么做呢?

def __del__ (self)
    self.connection.close()

这个方法不行。

谢谢。

3 个回答

0

创建一个数据库关闭请求的功能,这个功能可以在主窗口类中使用。

然后你可以在窗口的 closeEvent 里调用这个功能,可能还可以根据这个功能返回的结果采取不同的行动。

0

如果其他类也需要使用数据库连接,那么你可以创建一个类,这个类里面包含一些方法,比如创建数据库、连接和关闭数据库,以及从数据库中获取信息等等。然后其他类就可以继承这个类,使用里面的方法。

3

__del__ 这个函数只有在对象被销毁时才会被调用,也就是说,当没有其他对象再引用这个对象时,垃圾回收机制才会进行清理。

你可以查看一下在你放弃这个对象时,哪个对象还在引用你的类,或者在你的类里实现一个显式的关闭方法。

依赖 __del__ 方法来释放资源可能会有风险,因为我们认为对象已经被销毁时,实际上它可能还没有被销毁。

根据Python的文档:

有些对象会包含对“外部”资源的引用,比如打开的文件或窗口。我们知道这些资源在对象被垃圾回收时会被释放,但由于垃圾回收并不是一定会发生,因此这些对象通常会提供一个显式的方法来释放外部资源,通常是一个 close() 方法。强烈建议程序显式地关闭这些对象。使用‘try...finally’语句可以方便地做到这一点。

撰写回答