关于PyQt5和MySQL数据库连接不上的问题

关于PyQt5和MySQL数据库连接不上的问题

问题

win10系统,python3.7.6版本。为了做UI界面,安装了最新版的MySQL(8.0.28),又安装了PyQt5 5.15.4,也是最新版。结果运行如下代码,没有报错,也没有结果。

from PyQt5 import QtSql

db = QtSql.QSqlDatabase.addDatabase("QMYSQL")
db.setHostName("localhost")
db.setDatabaseName("knowledged") #自己的数据库名字
db.setUserName("root")
db.setPassword("123456")
db.setPort(3306)
print(db.open())

db.open()返回了False,说明数据库没有连上。于是在网上找了很多参考资料,大多是一样的,大意就是Driver not loaded这个问题吧,博主们都是要将MySQL安装目录下的libmysql.dll这个文件复制到PyQt5\Qt\bin这个目录,据说这样就解决了。

问题是,PyQt5的5.15.4版本里面,PyQt5\Qt\目录下根本就没有bin,网上所有教程几乎都没有提到这个问题。。。。然后我就怀疑是不是自己代码有错误,但是连接MySQL不管用QSqlDatabase还是pymysql都是那么几行代码,怎么检查都没什么毛病。我就为连接MySQL数据库这种没有任何技术含量的体力活困苦两三天,但是试了各种重装软件的操作也没解决。

解决办法

感谢这个网址,让我找到其他思路。https://www.cxymm.net/article/wuhs/94601527

问题很简单,就是PyQt版本太高了,我的PyQt5 5.15.4版本,运行以下命令。

print(QtSql.QSqlDatabase.drivers())

结果里面有QSQLITE、QODBC等等,就是没有QMYSQL,那驱动有问题,我怎么操作都没用。卸载PyQt5以后,运行以下命令安装老版本的PyQt。

pip install pyqt5==5.12.2

重新print(QtSql.QSqlDatabase.drivers()),结果如下。

['QSQLITE', 'QMYSQL', 'QMYSQL3', 'QODBC', 'QODBC3', 'QPSQL', 'QPSQL7']

有了QMYSQL,但是重新连接数据库,print(db.open())还是False。

结合我之前看的一些材料,我想问题出在新版本MySQL(8.0.28)上,我想如果用MySQL5肯定不会有任何问题。新版本的MYSQL是免安装版,估计可能某些配置给的不到位。就把libmysql.dll(不知道是干什么的)这个文件复制到Qt的环境下,具体操作如下。

先找到mysql安装目录下lib里面的libmysql.dll
请添加图片描述然后复制粘贴到pyqt对应的环境,我是在anaconda3里面创建的虚拟环境下安装的pyqt5,所以如下图。
请添加图片描述操作完了之后,运行以下代码试一试看看数据库连上没。问题解决了。

# -*- coding: utf-8 -*-
import sys #这句可能是不需要的
from PyQt5 import QtSql
#import ctypes
if __name__ == '__main__':
    #ctypes.windll.LoadLibrary('C:/mysql/mysql8028/lib/libmysql.dll') #如果不想把libmysql.dll文件从mysql安装目录复制到PyQt的bin目录下,那就加上这一句,也能解决问题。
    db = QtSql.QSqlDatabase.addDatabase("QMYSQL")
    db.setHostName("localhost")
    db.setDatabaseName("knowledged") #自己的数据库名字
    db.setUserName("root")
    db.setPassword("123456")
    db.setPort(3306)
    print(db.open())
    print(QtSql.QSqlDatabase.drivers())

q = QtSql.QSqlQuery()
q.exec_("create table if not exists t1 (f1 integer primary key,f2 varchar(20))")
q.exec_("delete from t1")

q.exec_(u"insert into t1 values(1,'我')")
q.exec_(u"insert into t1 values(2,'要吃烤羊腿')")
q.exec_("commit")

运行完了,打开数据库,果然新建立了一个t1表,表中出现了我想要添加的记录,接下来才能好好搬砖啊。。如下图。
请添加图片描述提刀而立,为之四顾,为之踌躇满志。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值