无法在 PySide2 上加载 QMYSQL 驱动程序

Posted

技术标签:

【中文标题】无法在 PySide2 上加载 QMYSQL 驱动程序【英文标题】:Unable to load QMYSQL Driver on PySide2 【发布时间】:2020-09-25 01:20:28 【问题描述】:

如何使用 Pyside2 (pip) 和 python3.8 安装和加载 Qmysql 驱动程序?我已经尝试下载 git:qtbase 并从那里编译驱动程序,但我运气不错。

【问题讨论】:

我正在使用 pyside2==5.15.0 【参考方案1】:

这个答案不仅涵盖 Linux 的安装,还涵盖其他操作系统的安装,此外它还适用于 pyqt5


Qt 使用的二进制文件与 PyQt5/PySide2 使用的二进制文件相同,因为它们使用相同的基本代码,因此您必须编译插件。

在这种情况下,要编译mysql插件,你必须遵循the official manual,总结起来就是:

    安装依赖项,在本例中为mysql-connector-c 安装与编译 pyqt5/pyside2 相同版本的 Qt 和开发工具,例如 Windows 上的 MSVC、Ubuntu 上的 build-essentials、MacOS 上的 XCode 等。 下载源代码,在本例中为qtbase repository。 编译插件。

要找出 Qt 的版本和编译库时使用的版本,可以使用以下命令:

PyQt5
python -c "from PyQt5.QtCore import QT_VERSION_STR; print('Qt version', QT_VERSION_STR)"
PySide2
python -c "from PySide2.QtCore import qVersion; print('Qt version', qVersion())"

上面根据操作系统生成libqsqlmysql.so、qsqlmysql.dll或libqsqlmysql.dylib。该文件必须粘贴在路径中:

PyQt5:
python -c "import os; from PyQt5.QtCore import QLibraryInfo; print('QT_SQL_DRIVER_PATH', os.path.join(QLibraryInfo.location(QLibraryInfo.PrefixPath), 'plugins', 'sqldrivers'))"
PySide2:
python -c "import os; from PySide2.QtCore import QLibraryInfo; print('QT_SQL_DRIVER_PATH', os.path.join(QLibraryInfo.location(QLibraryInfo.PrefixPath), 'plugins', 'sqldrivers'))"

为了涵盖所有案例,我创建了一个生成二进制文件的 Github Actions:

mysql_plugin.yml

name: generate_mysql_plugin

on: [push]

jobs:
  ci:
    name: $ matrix.os.name  Qt-$ matrix.qt.qt_version 
    runs-on: $ matrix.os.runs-on 
    strategy:
      fail-fast: false
      matrix:
        os:
          - name: Windows
            extension: "dll"
            runs-on: windows-2019
          - name: Linux
            extension: "so"
            runs-on: ubuntu-20.04
          - name: MacOS
            extension: "dylib"
            runs-on: macos-10.15
        qt:
          - name: 5.15
            qt_version: 5.15.0
    steps:
      - name: Checkout
        uses: actions/checkout@v1
      - name: Install Qt
        uses: jurplel/install-qt-action@v2
        with:
          version: $ matrix.qt.qt_version 
          dir: $ github.workspace /qt/
      - name: clone qtbase
        run: git clone -b $ matrix.qt.qt_version  https://code.qt.io/qt/qtbase.git
      - name: Compile mysql plugin on Windows
        if: matrix.os.name == 'Windows'
        shell: cmd
        run: |
          choco install wget
          wget https://downloads.mysql.com/archives/get/p/19/file/mysql-connector-c-6.1.11-winx64.zip
          unzip mysql-connector-c-6.1.11-winx64.zip
          copy /y "mysql-connector-c-6.1.11-winx64\lib\libmysql.dll" .
          call "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Auxiliary/Build/vcvars64.bat"
          cd qtbase/src/plugins/sqldrivers
          qmake -- MYSQL_INCDIR="$ github.workspace \mysql-connector-c-6.1.11-winx64\include" MYSQL_LIBDIR="$ github.workspace \mysql-connector-c-6.1.11-winx64\lib"
          nmake sub-mysql
          nmake install
      - name: Compile mysql plugin on Linux
        if: matrix.os.name == 'Linux'
        run: |
          wget https://downloads.mysql.com/archives/get/p/19/file/mysql-connector-c-6.1.11-linux-glibc2.12-x86_64.tar.gz
          tar zxvf mysql-connector-c-6.1.11-linux-glibc2.12-x86_64.tar.gz
          sudo cp mysql-connector-c-6.1.11-linux-glibc2.12-x86_64/lib/*.so /usr/lib/x86_64-linux-gnu
          sudo apt-get install freetds-dev
          cd qtbase/src/plugins/sqldrivers
          qmake
          cd mysql
          qmake
          make
          make install
      - name: Compile mysql plugin on MacOS
        if: matrix.os.name == 'MacOs'
        run: |
          brew install wget
          wget https://cdn.mysql.com/archives/mysql-connector-c/mysql-connector-c-6.1.11-macos10.12-x86_64.tar.gz
          tar zxvf mysql-connector-c-6.1.11-macos10.12-x86_64.tar.gz
          sudo cp mysql-connector-c-6.1.11-macos10.12-x86_64/lib/libmysqlclient.dylib mysql-connector-c-6.1.11-macos10.12-x86_64/lib/libmysqlclient_r.dylib
          sudo cp mysql-connector-c-6.1.11-macos10.12-x86_64/lib/libmysqlclient.18.dylib mysql-connector-c-6.1.11-macos10.12-x86_64/lib/libmysqlclient_r.18.dylib

          sudo cp mysql-connector-c-6.1.11-macos10.12-x86_64/lib/*.dylib /usr/local/lib
          cd qtbase/src/plugins/sqldrivers
          qmake -- MYSQL_PREFIX="$ github.workspace /mysql-connector-c-6.1.11-macos10.12-x86_64"
          make sub-mysql
          cd mysql
          make install
      - name: upload
        uses: actions/upload-artifact@v2
        with:
          path: qtbase/src/plugins/sqldrivers/plugins/sqldrivers/*qsqlmysql.$ matrix.os.extension 
          name: mysqlplugin-$ matrix.os.name -Qt$ matrix.qt.name 

前面的代码生成的插件可以找到here。


在 Ubuntu 的特定情况下,它可以简化为:

将libqsqlmysql.so 文件复制到QT_SQL_DRIVER_PATH。 执行sudo apt install libmysqlclient-dev

在 Windows 的特定情况下,它可以简化为:

将qsqlmysql.dll 文件复制到QT_SQL_DRIVER_PATH。 下载 mysql-connector-c for windows 并将 libmysql.dll 复制到您的脚本旁边。

【讨论】:

尝试打开 qsqlmysql.dll 文件时出现 404 错误。 @angelogro 然后从github.com/eyllanesc/***/actions/runs/412607469下载

以上是关于无法在 PySide2 上加载 QMYSQL 驱动程序的主要内容,如果未能解决你的问题,请参考以下文章

qt5.1.1 mysql ubuntu QMYSQL驱动未加载

Qt5、C++:未加载 QMYSQL 驱动程序

QSqlDatabase:Mac OS 上未加载 QMYSQL 驱动程序

未加载 QMYSQL 驱动程序,尝试了所有提示

PyQt5 QMYSQL 驱动程序未加载

Qt:Windows 10:未加载 QMYSQL 驱动程序