PyQt5 中调用MySql接口失败 ( QSqlDatabase 组件) 在Linux环境下如何修改

Posted wx62830f4b679a4

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PyQt5 中调用MySql接口失败 ( QSqlDatabase 组件) 在Linux环境下如何修改相关的知识,希望对你有一定的参考价值。

最近在跑下面这么一个代码,怎么跑都无法连通服务器,如下:

# -*- coding: utf-8 -*-


【简介】
PyQt5中 处理database 例子




import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtSql import QSqlDatabase

class ExecDatabaseDemo(QWidget):

def __init__(self, parent=None):
super(ExecDatabaseDemo , self).__init__(parent)

#self.db = QSqlDatabase.addDatabase(QSQLITE)
#self.db.setDatabaseName(./db/database.db)
# 打开数据库
#self.db.open()

self.con2 = QSqlDatabase.addDatabase(Qmysql)
self.con2.setHostName("67.209.xxx.xxx")
self.con2.setDatabaseName("mysql")
self.con2.setUserName("root")
self.con2.setPassword("xxxxxxxx")
a=self.con2.open()
print(a)

def closeEvent(self, event):
# 关闭数据库
self.con2.close()

if __name__ == __main__:
app = QApplication(sys.argv)
demo = ExecDatabaseDemo()
demo.show()
sys.exit(app.exec_())

这个代码不管怎么跑总是无法连通服务器端的数据库,在Windows平台下搞了快一天还是没有搞定,这就想起来使用Linux弄一下,毕竟我还是用LInux比较上手。


在Windows平台下跑不通但是不报错,也没有任何提示,但是在Linux平台下就不一样了,有报错信息,如下:

PyQt5


报错信息如下:

QSqlDatabase: QMYSQL driver not loaded

QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QPSQL QPSQL7

这个提示还是比较有用的,依据这个提示我在网上进行了一下搜索,还真有一些解答方法。

网上一般都是先使用这么一个步骤,如下:

ldd libqsqlmysql.so(ldd用来打印程序或者库文件所依赖的共享库列表)

于是在我的电脑上查找该文件:

sudo find / -name libqsqlmysql.so


PyQt5


最终发现了两个地方,一个是Python下面的PyQt5中, 一个是在  /usr/lib 下面,显而易见的是第一个文件便是我们要查找的文件。

ldd命令用于打印程序或者库文件所依赖的共享库列表

然后,查找该文件的共享库列表,直接感觉这个问题应该是共享库上有缺失。

ldd /usr/local/lib/python3.5/dist-packages/PyQt5/Qt/plugins/sqldrivers/libqsqlmysql.so

PyQt5


输出如下:


linux-vdso.so.1 =>  (0x00007ffc533af000)
libQt5Sql.so.5 => /usr/local/lib/python3.5/dist-packages/PyQt5/Qt/plugins/sqldrivers/../../lib/libQt5Sql.so.5 (0x00007faed77c2000)
libQt5Core.so.5 => /usr/local/lib/python3.5/dist-packages/PyQt5/Qt/plugins/sqldrivers/../../lib/libQt5Core.so.5 (0x00007faed7072000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007faed6e55000)
libmysqlclient.so.18 => not found
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007faed653f000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007faed6236000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007faed6020000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007faed5c56000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007faed5a3c000)
libicui18n.so.56 => /usr/local/lib/python3.5/dist-packages/PyQt5/Qt/plugins/sqldrivers/../../lib/libicui18n.so.56 (0x00007faed55a3000)
libicuuc.so.56 => /usr/local/lib/python3.5/dist-packages/PyQt5/Qt/plugins/sqldrivers/../../lib/libicuuc.so.56 (0x00007faed51eb000)
libicudata.so.56 => /usr/local/lib/python3.5/dist-packages/PyQt5/Qt/plugins/sqldrivers/../../lib/libicudata.so.56 (0x00007faed3808000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007faed3604000)
libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007faed3402000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007faed30f1000)
/lib64/ld-linux-x86-64.so.2 (0x00007faed7c1d000)
libssl.so.10 => not found
libcrypto.so.10 => not found
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007faed2e81000)


可以看到,上面显示一个有三个共享库是无法查找到的。

首先,就是要找到  libmysqlclient.so.18.0  文件。   查找整个电脑中的文件,没有该文件。

于是,就需要在网上 下载 这个文件   libmysqlclient.so.18.0   


在 CSDN  上发现了这个文件,不过苦于没有积分于是继续寻找。

最后,在  这个网站上发现了文件, 网站:​​https://rpm.pkgs.org/​

该文件下载地址:

​http://ftp.altlinux.org/pub/distributions/ALTLinux/Sisyphus/x86_64/RPMS.classic/libmysqlclient18-10.1.30-alt1.S1.x86_64.rpm​


下载好该文件,解压,发在文件夹

  /usr/lib/x86_64-linux-gnu/      下面,再次查看 libqsqlmysql.so  动态链接库列表,发现:

PyQt5


证明此时  libmysqlclient.so.18.0     这个动态链接库已经可以加载上了。

然后就是解决另两个  动态链接库的问题了。

根据网上的信息需要继续安装东西,不知道是否正确,就直接安装了,步骤如下:

sudo apt-get install openssl

sudo apt-get install libssl1.0.0 libssl-dev

然后在电脑上查找这两个文件,发现还是找不到。

不停的尝试中, 试了如下操作,

ldd /usr/bin/openssl

发现了神奇的事情,如下:

linux-vdso.so.1 =>  (0x00007ffd75316000)
libssl.so.1.0.0 => /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007f279141c000)
libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007f2790fd8000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2790c0e000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2790a0a000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2791685000)


PyQt5


从上面发现,  libssl.so.10  he   libcrypto.so.10   应该就是  libssl.so.1.0.0   和   libcrypto.so.1.0.0

于是便进行了如下操作:

sudo ln -s /lib/x86_64-linux-gnu/libssl.so.1.0.0 /lib/x86_64-linux-gnu/libssl.so.10

sudo ln -s /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 /lib/x86_64-linux-gnu/libcrypto.so.10


PyQt5

全部搞定后,运行我们的数据库连接文件,结果如下:

PyQt5



证明 PyQt5  下使用   QSqlDatabase  也可以连接MySql数据库。

最终发现其实PyQt5上默认是不带  MySQL驱动的,而它所调用的MySQL驱动其实主要是调用  MySQL的CLient部分的共享库。


以上是关于PyQt5 中调用MySql接口失败 ( QSqlDatabase 组件) 在Linux环境下如何修改的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5代码在某个功能启动时失败

如何在 QTableView 中将 QColor 作为 QBackgroundRole 返回,它在 PyQt5 中具有预设样式表?

从浏览器调用查询字符串(qs)时出错

接口返回失败是啥意思

PyQt5 在 dbus 请求失败时创建错误

Pyqt5 已安装,但在导入时出现 dll 加载失败错误?