PyQt窗口中如何实时获取MySQL更新后的记录?
解决数据库查询无法获取最新数据的问题
问题根源:你在程序启动时创建了全局的数据库游标/连接,MySQL默认的REPEATABLE READ事务隔离级别会让同一个事务内的查询结果保持一致,外部通过其他工具提交的更新在当前事务中无法被看到,必须重启程序重建连接才能获取新数据。
下面提供两种可行的解决方案:
方案1:每次查询新建数据库连接(推荐)
每次触发查询时重新建立数据库连接和游标,用完立即关闭,确保每次查询都能获取最新数据,同时避免长时间持有连接导致的异常。
修改后的代码:
import sys from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.uic import loadUi # 根据你的实际情况引入数据库连接模块 import MySQLdb class My_Window(QMainWindow): def __init__(self): super().__init__() loadUi("test.ui", self) self.lineEdit.textChanged.connect(self.findid) def findid(self, txt): if not txt: return try: # 每次查询新建连接(如果你的db()函数已封装连接参数,直接替换为conn = db()) conn = MySQLdb.connect(host='你的主机地址', user='数据库用户名', password='数据库密码', database='目标数据库名') cur = conn.cursor() select_id = "SELECT id from accounts WHERE name = %s" cur.execute(select_id, (txt,)) name_id = cur.fetchone() if name_id: print(name_id[0]) except Exception as e: print(f"查询出错: {str(e)}") finally: # 确保游标和连接被关闭 if 'cur' in locals(): cur.close() if 'conn' in locals(): conn.close() if __name__ == "__main__": app = QApplication(sys.argv) The_Window = My_Window() The_Window.show() sys.exit(app.exec_())
方案2:开启连接自动提交模式
如果不想每次创建连接,可以开启数据库连接的自动提交功能,让每次查询都在独立事务中执行,这样就能看到外部提交的最新数据。
修改后的代码:
import sys from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.uic import loadUi import MySQLdb # 全局创建连接并开启自动提交 conn = MySQLdb.connect(host='你的主机地址', user='数据库用户名', password='数据库密码', database='目标数据库名') conn.autocommit(True) # 开启自动提交,每次查询都属于独立事务 cur = conn.cursor() class My_Window(QMainWindow): def __init__(self): super().__init__() loadUi("test.ui", self) self.lineEdit.textChanged.connect(self.findid) def findid(self, txt): if not txt: return select_id = "SELECT id from accounts WHERE name = %s" cur.execute(select_id, (txt,)) name_id = cur.fetchone() if name_id: print(name_id[0]) if __name__ == "__main__": app = QApplication(sys.argv) The_Window = My_Window() The_Window.show() # 程序退出时关闭连接 try: sys.exit(app.exec_()) finally: cur.close() conn.close()
注意事项
- 如果你的
db()函数已经封装了所有连接参数,直接替换代码中的MySQLdb.connect(...)为conn = db()即可。 - 方案1的连接开销对于桌面程序的输入查询场景可以忽略,且稳定性更高,不会因为连接长时间闲置被数据库服务器断开。
- 方案2需要注意连接保活问题,如果程序运行时间过长,可能需要添加连接重连逻辑。
内容的提问来源于stack exchange,提问作者Mian
相关产品推荐
相关产品推荐

