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

PyQt5中QMYSQL驱动加载失败,MySQL映射QTableView求助

问题描述

尝试将MySQL数据库映射到QTableView时,出现以下错误:

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMARIADB QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7

已按照指引将qsqlmysql.dll和libmysql.dll移至对应路径,但问题仍未解决。

环境信息:

  • Python 3.9.13 64位
  • Windows 10
  • PyQt 5.15.4

相关代码如下:

from mysql.connector import connect, Error
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtSql import QSqlDatabase, QSqlTableModel
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView

class Ui_self(QMainWindow):
    connection = connect(host="",
                         user='',
                         password='',
                         database="",
                         charset='utf8')

    def __init__(self):
        super().__init__()
        self.setWindowTitle("MySQL Table View")
        self.resize(800, 600)
        db = QSqlDatabase.addDatabase("QMYSQL")
        db.setHostName("")
        db.setDatabaseName("")
        db.setUserName('')
        db.setPassword('')
        db.open()
        self.setupUi()
        self.show()

    def setupUi(self):
        self.setObjectName("MainWindow")
        self.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(self)
        self.centralwidget.setObjectName("centralwidget")

        self.model = QSqlTableModel()
        self.model.setTable('students')
        self.model.setEditStrategy(QSqlTableModel.OnFieldChange)
        self.model.select()
        self.tableView = QtWidgets.QTableView(self.centralwidget)
        self.tableView.setGeometry(QtCore.QRect(0, 0, 801, 561))
        self.tableView.setObjectName("tableView")
        self.tableView.setModel(self.model)

        self.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(self)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName("menubar")
        self.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(self)
        self.statusbar.setObjectName("statusbar")
        self.setStatusBar(self.statusbar)

        self.retranslateUi()
        QtCore.QMetaObject.connectSlotsByName(self)

    def retranslateUi(self):
        _translate = QtCore.QCoreApplication.translate
        self.setWindowTitle(_translate("MainWindow", "MainWindow"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    ui = Ui_self()
    sys.exit(app.exec_())
解决方案

1. 确认DLL版本匹配

  • 确保libmysql.dll是64位版本,且与MySQL服务器版本兼容(PyQt 5.15.4的QMYSQL驱动适配MySQL 8.0及以上版本)。
  • 确认qsqlmysql.dll来自PyQt5的安装目录(如Lib\site-packages\PyQt5\Qt\plugins\sqldrivers),避免混用其他版本驱动。

2. 修正DLL放置路径

  • 将libmysql.dll放到Python根目录(如C:\Python39)或系统System32目录(C:\Windows\System32)。
  • 确保qsqlmysql.dll在PyQt5的sqldrivers插件目录,若Qt未识别该路径,手动添加:
    from PyQt5.QtCore import QCoreApplication
    QCoreApplication.addLibraryPath("你的PyQt5插件路径,比如Lib/site-packages/PyQt5/Qt/plugins")
    

3. 修复代码问题

  • 移除类级别的connection变量,避免mysql.connector与QSqlDatabase资源冲突。
  • 添加连接错误捕获,方便排查:
    if not db.open():
        print(db.lastError().text())
    
  • 将QSqlTableModel与已打开的数据库关联:
    self.model = QSqlTableModel(db=db)
    

4. 检查依赖缺失

用Dependency Walker工具打开qsqlmysql.dll,查看是否存在缺失的依赖项(如Qt相关DLL),补充对应文件即可。

内容的提问来源于stack exchange,提问作者KsOnd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:05:04