You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:57:50