最近在跑下面这么一个代码,怎么跑都无法连通服务器,如下:
# -*- 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平台下就不一样了,有报错信息,如下:
报错信息如下:
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QPSQL QPSQL7
这个提示还是比较有用的,依据这个提示我在网上进行了一下搜索,还真有一些解答方法。
网上一般都是先使用这么一个步骤,如下:
ldd libqsqlmysql.so(ldd用来打印程序或者库文件所依赖的共享库列表)
于是在我的电脑上查找该文件:
sudo find / -name libqsqlmysql.so
最终发现了两个地方,一个是Python下面的PyQt5中, 一个是在 /usr/lib 下面,显而易见的是第一个文件便是我们要查找的文件。
ldd命令用于打印程序或者库文件所依赖的共享库列表
然后,查找该文件的共享库列表,直接感觉这个问题应该是共享库上有缺失。
ldd /usr/local/lib/python3.5/dist-packages/PyQt5/Qt/plugins/sqldrivers/libqsqlmysql.so
输出如下:
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/
该文件下载地址:
下载好该文件,解压,发在文件夹
/usr/lib/x86_64-linux-gnu/ 下面,再次查看 libqsqlmysql.so 动态链接库列表,发现:
证明此时 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)
从上面发现, 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 下使用 QSqlDatabase 也可以连接MySql数据库。
最终发现其实PyQt5上默认是不带 MySQL驱动的,而它所调用的MySQL驱动其实主要是调用 MySQL的CLient部分的共享库。