Не удалось загрузить драйвер QMYSQL на PySide2

#python #mysql #pyqt5

Вопрос:

Как я могу установить и загрузить драйвер Qmysql с помощью Pyside2 (pip) с python3.8? Я уже пытался загрузить git:qtbase и скомпилировал драйвер оттуда, но мне повезло.

Комментарии:

1. Я использую pyside2==5.15.0

Ответ №1:

Этот ответ охватывает не только установку для Linux, но и для других ОС, кроме того, он также применим для pyqt5


Двоичные файлы, используемые Qt, являются теми же, что и PyQt5/PySide2, так как они используют один и тот же базовый код, поэтому вам придется скомпилировать плагины.

В этом случае для компиляции плагина mysql вы должны следовать официальному руководству, которое вкратце является:

  1. Установите зависимости, в данном случае mysql-connector-c
  2. Установите Qt той же версии, с которой был скомпилирован pyqt5/pyside2, и инструменты разработки, такие как MSVC в Windows, build-essentials в Ubuntu, XCode в macOS и т. Д.
  3. Загрузите исходный код, в данном случае репозиторий qtbase.
  4. Скомпилируйте плагин.

Чтобы узнать версию 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, которые генерируют двоичные файлы:

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-winx64liblibmysql.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-winx64include" MYSQL_LIBDIR="${{ github.workspace }}mysql-connector-c-6.1.11-winx64lib"
          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 }}
 

Предыдущий код генерирует плагин, который вы можете найти здесь.


В конкретном случае Ubuntu это может быть сведено к:

  • Скопируйте libqsqlmysql.so файл в QT_SQL_DRIVER_PATH.
  • Выполнять sudo apt install libmysqlclient-dev

В конкретном случае Windows это может быть сведено к:

Комментарии:

1. Я получаю 404 ошибки при попытке открыть qsqlmysql.dll файл.

2. @angelogro затем загрузите с github.com/eyllanesc/stackoverflow/actions/runs/412607469