PyQt5工作线程无法连接MySQL数据库问题求助
解决PyQt5工作线程中MySQL驱动加载失败的问题
看起来你踩了PyQt5连接MySQL的几个常见坑,虽然驱动列表显示QMYSQL可用,但实际底层依赖没加载,再加上代码里的小错误,导致连接失败。我帮你一步步排查:
1. 先修正代码里的明显错误
你的代码里setHostName传的是数字192.168.56.1,但这个方法需要字符串类型的IP地址,直接写数字会导致参数错误,这可能是连接失败的原因之一。赶紧改成:
self.db.setHostName('192.168.56.1')
2. 把数据库连接逻辑移到run()方法里
QThread的__init__方法是在主线程执行的,哪怕你后续启动子线程,数据库对象的初始化还是在主线程环境中,这可能和PyQt5的线程安全机制冲突。正确的做法是把数据库连接的代码放到run()方法里——这才是子线程的真正执行入口:
class Worker(QThread): def __init__(self): super(Worker, self).__init__() self.db = None self.query = None def run(self): print('Opening DB in worker thread') # 传入唯一标识避免多线程驱动冲突 self.db = QtSql.QSqlDatabase.addDatabase("QMYSQL", "worker_db") print('Driver available? ', self.db.isDriverAvailable("QMYSQL")) self.db.setHostName('192.168.56.1') self.db.setDatabaseName('Automation_DB') self.db.setUserName('root') self.db.setPassword('root') if self.db.open(): print('DB opened successfully!') self.query = QSqlQuery(self.db) # 在这里执行你的数据库操作 else: print('Failed to open DB') print('Last Error ', self.db.lastError().text()) print('Drivers ', self.db.drivers())
3. 解决「Driver not loaded」的核心问题
PyQt5的QMYSQL驱动本身只是一个封装,它依赖MySQL的底层动态链接库libmysql.dll(Windows下),这个文件不会随PyQt5自动安装。你需要手动处理:
- 找到你Windows系统上安装的MySQL目录(比如
C:\Program Files\MySQL\MySQL Server 8.0\lib),复制里面的libmysql.dll - 把这个文件放到PyQt5的
Qt5/bin目录下(通常在Python的site-packages里,比如Lib\site-packages\PyQt5\Qt5\bin),或者直接加到系统的PATH环境变量中
⚠️ 注意:必须保证libmysql.dll的位数和你的Python/PyQt5一致——如果是64位Python,就用64位MySQL的libmysql.dll,32位同理,否则会加载失败。
4. 最后再确认MySQL的远程配置
虽然你说命令行能连接,但还是再检查一下Ubuntu上的MySQL配置:
- 打开
/etc/mysql/mysql.conf.d/mysqld.cnf,确保bind-address设置为0.0.0.0(允许所有IP连接) - 确认Ubuntu的防火墙开放了3306端口(可以用
ufw allow 3306临时测试)
按照这几步改完,应该就能解决连接问题了。
内容的提问来源于stack exchange,提问作者MikG
相关产品推荐
相关产品推荐

