使用 PySide2 QtSql QSqlDatabase 时缺少 MySql 驱动程序

Posted

技术标签:

【中文标题】使用 PySide2 QtSql QSqlDatabase 时缺少 MySql 驱动程序【英文标题】:Missing MySql driver when using PySide2 QtSql QSqlDatabase 【发布时间】:2020-07-01 11:51:05 【问题描述】:

我正在将一些代码从 PySide 移植到 PySide2,我注意到我缺少几个 sql 驱动程序。

$ python3
Python 3.6.8 (default, Apr  2 2020, 13:34:55) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import PySide.QtSql; import PySide2.QtSql
>>> PySide.QtSql.QSqlDatabase.drivers()
['QSQLITE', 'QSQLITE3', 'Qmysql3', 'QMYSQL', 'QODBC3', 'QODBC', 'QPSQL7', 'QPSQL']
>>> PySide2.QtSql.QSqlDatabase.drivers()
['QSQLITE', 'QODBC', 'QODBC3', 'QPSQL', 'QPSQL7']

如您所见,我在PySide2(以及其他)上缺少QMYSQL。我需要那个才能让我的应用程序正常工作。

我尝试安装几个软件包,例如 mysql mysql-connector-pythonpip,但这并没有改变任何东西。然后我尝试更改QTDIR,因为我注意到它指向/usr/lib64/qt-3.3 而不是/usr/lib64/qt5。那也没有任何作用。

我还检查了/usr/lib64/qt4/plugins/sqldrivers/usr/lib64/qt5/plugins/sqldrivers 中的libqsqlmysql.so,它存在于两个文件夹中。

顺便说一句,我在 CentOS 7 上。不过,我正在尝试在 CentOS 7 和 8 上安装该软件。

我看到的几乎所有关于它的帖子都没有丢失驱动程序,但它们无法加载。

知道可能是什么问题吗?

【问题讨论】:

【参考方案1】:

很可能,插件目录不在“/usr/lib64/qt5/plugins”中,所以它不会加载mysql插件。解决办法是复制插件,所以首先要知道PySide2目录插件,执行如下命令:

$ python3 -c "from PySide2 import QtCore; print(QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.PluginsPath))"

输出:

/usr/local/lib64/python3.6/site-packages/PySide2/Qt/plugins

所以你应该使用以下命令复制.so:

$ cp /usr/lib64/qt5/plugins/sqldrivers/libqsqlmysql.so /usr/local/lib64/python3.6/site-packages/PySide2/Qt/plugins/sqldrivers

即便如此,.so 指向的是操作系统的 Qt,而不是 PySide2 的 Qt:

$ ldd  /usr/local/lib64/python3.6/site-packages/PySide2/Qt/plugins/sqldrivers/libqsqlmysql.so

输出

linux-vdso.so.1 =>  (0x00007fffb974f000)
libQt5Sql.so.5 => /lib64/libQt5Sql.so.5 (0x00007faa76f00000)
libQt5Core.so.5 => /lib64/libQt5Core.so.5 (0x00007faa76895000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007faa76679000)
libmysqlclient.so.18 => /usr/lib64/mysql/libmysqlclient.so.18 (0x00007faa76179000)
# ...

为此,您必须使用 patchelf 更改 rpath:

$ yum install epel-release
$ yum install patchelf
$ patchelf --set-rpath \$ORIGIN/../../lib  /usr/local/lib64/python3.6/site-packages/PySide2/Qt/plugins/sqldrivers/libqsqlmysql.so

再次:

$ ldd  /usr/local/lib64/python3.6/site-packages/PySide2/Qt/plugins/sqldrivers/libqsqlmysql.so

输出

linux-vdso.so.1 =>  (0x00007ffd013ad000)
libQt5Sql.so.5 => /usr/local/lib64/python3.6/site-packages/PySide2/Qt/plugins/sqldrivers/../../lib/libQt5Sql.so.5 (0x00007f6e1fb4c000)
libQt5Core.so.5 => /usr/local/lib64/python3.6/site-packages/PySide2/Qt/plugins/sqldrivers/../../lib/libQt5Core.so.5 (0x00007f6e1f359000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f6e1f13d000)
libmysqlclient.so.18 => /usr/lib64/mysql/libmysqlclient.so.18 (0x00007f6e1ec3d000)
# ...

最后:

$ python3 -c "from PySide2 import QtSql; print(QtSql.QSqlDatabase.drivers())"

输出:

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

插件之间似乎没有二进制兼容性,所以必须使用源代码编译:

$ python3 -m pip install aqtinstall
$ python3 -m aqt install 5.15.0 linux desktop --outputdir qt
$ sudo yum -y install git
$ sudo yum -y install libxcb libxcb-devel xcb-util xcb-util-devel xcb-util-*-devel libX11-devel libXrender-devel libxkbcommon-devel libxkbcommon-x11-devel libXi-devel libdrm-devel libXcursor-devel libXcomposite-devel
$ sudo yum -y install centos-release-scl
$ sudo yum -y install devtoolset-7-gcc*
$ sudo yum -y groupinstall 'Development Tools'
$ sudo yum -y install mysql-devel
$ scl enable devtoolset-7 bash
$ git clone -b 5.15.0 git://code.qt.io/qt/qtbase.git
$ cd qtbase/src/plugins/sqldrivers/mysql
$ sed -i 's/QMAKE_USE += mysql/# QMAKE_USE += mysql/g' mysql.pro
$ echo "INCLUDEPATH += /usr/include/mysql" >> mysql.pro
$ echo "QMAKE_LIBDIR += /usr/lib64/mysql" >> mysql.pro
$ echo "LIBS += -lmysqlclient" >> mysql.pro
$ ../../../../../qt/5.15.0/gcc_64/bin/qmake
$ make
$ sudo cp ../plugins/sqldrivers/libqsqlmysql.so /usr/local/lib64/python3.6/site-packages/PySide2/Qt/plugins/sqldrivers

最后:

$ python3 -c "from PySide2 import QtSql; print(QtSql.QSqlDatabase.drivers())"

输出:

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

【讨论】:

这很有帮助!非常感谢! 虽然版本不同。当我尝试使用驱动程序时,我得到Cannot mit incompatible Qt library (5.9.7) with this library (5.15.0) 并且应用程序崩溃了。我是否需要从源代码构建自己的libqsqlmysql.so

以上是关于使用 PySide2 QtSql QSqlDatabase 时缺少 MySql 驱动程序的主要内容,如果未能解决你的问题,请参考以下文章

QtSql:绑定不会改变使用 SQLite 的查询

无法使用 QtSQL 编译 Qt 项目(链接器错误)

ImportError 与“导入 PyQt5.QtSql”

QtSql编程RedHat linux系统下oracle数据库中文乱码

QT使用SQLite

PyQt & QtSql 数据库 - 自定义连接和 QSqlTableModel 的问题