Qmysql driver not loaded qt что делать

Обновлено: 07.07.2024

У меня возникает эта проблема, когда я пытаюсь подключиться к локальной базе данных mysql с помощью метода QSqlDatabase.addDatabase ().

Я знаю, что есть несколько похожих вопросов, но они не предлагают четких решений, особенно поскольку большинство из них касается C ++, и они предположили, что мы можем документацию Qt, которую я не могу

В частности, я хотел бы знать, какие файлы отсутствуют (.dll, .so, .lib)? где их взять? и где мне их скопировать? в случае Python, а не C ++

Это ошибка, которую я получаю при попытке запустить мой скрипт python:

Я использую Windows 10, MySql 8, Python 3.6, PyQt 5.9 и PyQt-tools 5.9 (я использую эту версию PyQt, потому что я также использую fbs, в руководстве fbs говорится, что он лучше работает с этой версией PyQt5 и Python)

Это полезное утверждение, которое я прочитал в stackoverflow, но оно предназначено для C ++: "" "Помните, что плагин qsqlmysql в основном представляет собой интерфейс qt, который использует методы соединителя mysql-C. Но, к сожалению, этот соединитель не распространяется с Qt, поэтому вы должны предоставить это самостоятельно. "" "

Итак, как я сказал ранее, важно знать, какие файлы отсутствуют (.dll, .so, .lib)? где их взять? и где мне их скопировать?

Пожалуйста, дайте мне знать, если вам понадобится мой сценарий, но он очень простой:

  1. Я пытаюсь подключиться с помощью QSqlDatabase.addDatabase ('QMYSQL')
  2. Создайте экземпляр QSqlTableModel, который использует это соединение с базой данных и задает одну таблицу этой базы данных.
  3. Отобразите эту единственную таблицу в QTableView.

2 ответа

Попробуйте использовать QMYSQL3 как:

Если ваша проблема не решена, вы можете проверить, что вашего файла libmysql.dll нет в вашей исполняемой папке python, и если да, скопируйте файл из python 3.x / lib / site-packages в вашу исполняемую папку python 3.xx . У меня это сработало.

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

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

  • Установите зависимости, в данном случае mysql-connector-c
  • Установите Qt и инструменты разработки, такие как MSVC в Windows, необходимые для сборки в Ubuntu, XCode в MacOS и т. Д.
  • Загрузите исходный код, в данном случае репозиторий qtbase.
  • Скомпилируйте плагин.

Приведенное выше создает libqsqlmysql.so, qsqlmysql.dll или libqsqlmysql.dylib в зависимости от ОС. Этот файл необходимо вставить в путь:

Вы также должны скопировать зависимости в места, которые устанавливает двоичный файл (чтобы узнать, что вы можете использовать ldd в Linux или OTool в MacOS, в случае Windows просто поместите его рядом со скриптом).

Чтобы упростить задачу, я создал действие github, которое создает двоичные файлы.

В вашем случае это можно резюмировать как:

Загрузите файл mysqlplugin-Windows-Qt5.9 и скопируйте файл. dll по пути, указанному вверху.

Он говорит что QMYSQL не установлен, а потом сам же его предлагает.

Подключение к базе соответственно не проходит. Подскажите что делать.

  • libqsqlite.so
  • libqsqlmysql.so
  • libqsqlpsql.so


66k 154 154 золотых знака 66 66 серебряных знаков 203 203 бронзовых знака


801 1 1 золотой знак 7 7 серебряных знаков 18 18 бронзовых знаков

То, о чем уже говорилось в другом вопросе:

Cannot load library /opt/Qt/5.5/gcc_64/plugins/sqldrivers/libqsqlmysql.so: (libmysqlclient_r.so.16: невозможно открыть разделяемый объектный файл: Нет такого файла или каталога)"

Установим libmysqlclient нужной версии:

Нет нужных dll. Удостоверимся, что libssl установлен:

Это наверно лишнее:


Вместе с MySQL поставляется библиотека клиента, путь к которой нужно добавить в переменную окружения Path (или скопировать в папку, уже добавленную в Path). Где в Linux хранится данная библиотека, к сожалению не знаю. Плагины собирать вручную не надо, в этой версии qt они уже собраны.

Мне помогло установить библиотеку с драйвером mysql for qt5


31.9k 22 22 золотых знака 119 119 серебряных знаков 206 206 бронзовых знаков

У меня проблема решилась установкой XAMPP, ничего не прописывал, видимо система сама прописала путь в переменную среды. Но на остальных система ( я ставил на все ( Windows, OS X ) ) проблема так и не решилась.


801 1 1 золотой знак 7 7 серебряных знаков 18 18 бронзовых знаков


А покажи strace, вангую, что он ищет свою *.so-шку, не находит и dlopen() обламывается.

PS Qt не знаю, этот пост на правах телепата.

DELIRIUM ☆☆☆☆☆ ( 04.12.16 08:55:43 )
Последнее исправление: DELIRIUM 04.12.16 08:56:30 (всего исправлений: 1)


Какая версия Qt?

Сразу после QSqlDatabase::addDatabase() проверь базу с помощью метода isValid(), что он возвращает?



Qt версии 5.7.0 для Desktop


Я так глубоко пока не готов идти )


Это просто, запускаешь

Получаешь вывод. Изучаешь его на предмет приватных данных, и заливаешь на какой-нибудь pastebin.


Вывод получается очень уж большой


Не волнуйся, мы знаем, что искать.




Нет, это значит, что она открылась, open возвращает файловый дескриптор или -1 в случае ошибки


А как понять эти две строки


Первая — проверка существования пути в билд-директории. Оно зафэйлилось, это значит, что ты вручную в билд-директорию не ложил SQL-драйвер. А вот второе нашлось и открывается.

Я пытаюсь получить доступ к базе данных MySQL из приложения Qt, но я получаю следующую ошибку:

Я нахожу это очень странной причиной, у меня есть libqsqlmysql.Итак, в моей папке Qt. Я даже попытался скомпилировать драйвер MySql как статический плагин и добавить его к моему .pro файл как:

но это также генерирует ту же ошибку времени выполнения (она должна была найти причину плагина, нет ошибки компиляции приложения)

что я упустил? Я хотел бы чтобы избежать необходимости компилировать Qt из исходного кода, это должно будет легко работать и на машинах развертывания.

BTW: хотя я разрабатываю и тестирую Linux, мне нужно будет поддерживать Windows. Будет ли у меня такая же проблема в Windows? Как я могу скомпилировать и связать драйвер MySql как в Linux, так и в Windows?

решение:

после выполнения рекомендаций @Sergey я сделал strace приложения, перенаправляя вывод на grep, поэтому я может искать "mysql" и для моего удивления приложение не поиск плагина в QTDIR / plugins / sqldrivers, где у меня был libqsqlmysql.Итак, это был глядя на QTDIR / lib. После копирования плагина в папку lib соединение MySql работало.

попробуйте открыть общую библиотеку с помощью dlopen() и посмотреть, загружается ли она, а если нет, что dlerror() говорит вам. Я всегда сталкиваюсь с подобными проблемами в Windows. LoadLibrary ()/GetLastError () спас меня много раз (в последний раз это было из-за неправильной версии некоторой библиотеки DLL libiconv / libintl). Запуск ldd на плагине также может помочь.

если dlopen () работает нормально, попробуйте загрузить плагин с помощью QPluginLoader. Если он не загружается, то проверьте buildkey плагина. Я обычно делаю это грязное способ, запустив строки в плагине, а затем ища строки, такие как" buildkey "или"QT_PLUGIN_VERIFICATION_DATA". Просто глядя на ключ сборки и вокруг него, вы можете получить представление. Например, вы можете понять, что вы скомпилировали плагин в режиме выпуска, в то время как приложение скомпилировано в режиме отладки. В таком случае ключ сборки не будет совпадать, и плагин не будет загружаться. Все в ключе сборки должно соответствовать вашей конфигурации. Обратите внимание, что версия и ключ сборки проверены по-другому: ключ сборки должен точно соответствовать (или соответствовать некоторой черной магии, называемой QT_BUILD_KEY_COMPAT), но в версии только основная версия должна соответствовать точно, младшая версия должна быть версией Qt, с которой плагин был скомпилирован или позже, и уровень патча игнорируется. Поэтому, если ваш плагин был скомпилирован с Qt 4.х.Y, то он будет работать с Qt версии 4.z.* где z>=x. Это действительно имеет смысл.

если ключ сборки выглядит нормально (что маловероятно, если вы дошли до этого момента), вы возможно, вы захотите посмотреть исходный код QLibraryPrivate::isPlugin (), чтобы понять, что не так, но это не похоже на легкую задачу для меня (хотя запуск этого в отладчике может помочь).

если qpluginloader загружает плагин, проверьте, находится ли он в правильном каталоге и имеет правильные разрешения. Если вы все еще не решили проблему к этому моменту, пришло время взглянуть на исходный код модуля SQL, который фактически загружает эти плагины. Но это крайне маловероятно. Я столкнулся с этой проблемой много, много раз, и всегда либо библиотека не загружалась, либо ключ сборки не совпадал.

другой способ пойти после того, как QPluginLoader успешно загружает плагин, это использовать strace, чтобы выяснить, пытается ли программа хотя бы открыть файл plugin. Поиск чего-то вроде "sqldrivers" или "plugins" в выводе strace также должен выдать каталог, в котором Qt ищет свои плагины и, в частности, SQL водители.

обновление

можно ли скомпилировать драйвер как статический плагин и ни о чем не беспокоиться? Попробуем:

он компилируется отлично, и теперь я получил libqsqlpsql.a (выпуск) и libqsqlpsqld.a (debug) в QTDIR / плагинах / sqldrivers (it is правильное место на Windows). Я использую драйвер PostgreSQL здесь, но я не думаю, что он будет отличаться для MySQL, который я просто не установил. Хорошо, давайте скомпилируем какая-то реальная программа с ним:

обратите внимание, что мне пришлось вручную ссылаться на libpq, иначе компоновщик будет жаловаться на неопределенные ссылки. Самое смешное, что qmake знает, что qsqlpsql находится в qtdir/plugins/sqldrivers и соответственно устанавливает параметры компилятора и компоновщика. Поэтому он по-прежнему должен быть в нужном месте для работы, только вам не нужно беспокоиться о том, что ваши пользователи сталкиваются с той же проблемой, что и при компиляции. Альтернативой было бы просто использовать LIBS+=-Lpath/to/plugin LIBS+=-lqsqlpsql вместо QTPLUGIN+=qsqlpsql , по крайней мере, врачи говорят, что он должен работать, но я не проверял.

для того, чтобы приложение действительно использовало плагин, я должен был поместить следующее в мой основной блок (CPP-файл):

это работает! Кроме того, из того, что я смог выяснить из источников, ключ сборки и версия проверяются только тогда, когда плагин динамически загружен (все соответствующие вещи находятся в частном классе QLibrary, даже не QPluginLoader). Так полученный исполняемый файл может (или не может, в зависимости от бинарной совместимости) работать даже с разными версиями и сборками Qt, хотя использование его со старыми версиями может вызвать некоторые ошибки, которые были исправлены позже.

сначала я скомпилировал QT, а затем понял, что мне нужен mysql. Поэтому я скомпилировал плагин mysql выполнение следующей команды в папке QT-DIR\src\plugins\sqldrivers\mysql.

MySQL плагин компиляции команды

qmake в "INCLUDEPATH+=$$цитата(C:\Program файлы\\сервер MySQL сервер MySQL 5.5\включить)" "каталог libs+=$$цитата(C:\Program файлы\с mysql\mysql сервер 5.5\Либ\libmysql.lib) " mysql.про

затем Плагины создаются в папке created in QT-DIR\plugins\sqldrivers. Однако, когда я попытался использовать его в своем коде. Это не удалось со следующей ошибкой.

ошибка msg

QSqlDatabase: драйвер QMYSQLDriver не загружен

решение

после некоторого googling и проверки переменной пути я понял, что сервер Mysql lib ( C:\Program каталог Files\MySQL\MySQL Server 5.5\lib) не был в моей переменной Path. Я ожидаю, что dll в этой папке используются плагином во время выполнения. После включения mysql server lib в путь переменная все работало гладко. Надеюсь, эта информация спасет некоторые волосы на голове других программистов, так как я выкорчевал довольно много. : D

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

построение Qt из источников не сложно, это займет некоторое время. Вероятно, у вас уже есть необходимые инструменты.

возможным обходным путем может быть доступ к серверной части через ODBC вместо этого.

для того, чтобы ваше приложение могло забрать плагин во время выполнения, общая библиотека, реализующая плагин MySQL, должна быть помещена в правильный каталог. Лучший способ определения этого каталога-проверить вывод QCoreApplication::libraryPaths . Вы также можете принудительно использовать определенные пути с помощью .

обратите внимание, что плагины должны быть помещены в подкаталоги в пределах пути плагина и заключительной части имени пути (т. е. родительского каталога общие библиотеки) не может быть изменен. Драйверы SQL должны находиться в каталоге с именем sqldrivers , то есть <pluginpath>/sqldrivers . Дополнительные сведения о каталогах плагинов см. В разделе как создать Плагины Qt.

Я также испытывал эту же проблему. Я устанавливал и экспериментировал с множеством различных инструментов Python и UIs. Затем я удалил все, что связано с Python. Я сделал новую установку Python 3.2, PyQT 3.2 и Eric5. Нет больше ошибок с драйвером QMySQL.

ну у меня была эта проблема, и через много времени и разных инструментов я обнаружил, что QT ( в windows, не удалось протестировать на Linux.) загружает " QSQLMYSQL.."по запросу, но до выполнения lib ("QSQLMYSQL..") файл должен находиться на одном из искомых путей (QApp.libraryPaths ()) внутри папки под названием "sqldrivers".. в противном случае QT просто проигнорирует файл, даже если он находится в какой-то другой точке внутри искомого пути. то, что я сделал, - это мониторинг зависимости образца app, и когда я удалил " QSQLMYSQL.."dll из" plugins\sqldrivers\ "не удалось, но когда я сделал папку внутри папки приложения, под названием" sqldrivers "и разместил" QSQLMYSQL. - внутри он заряжен. у меня есть mysql 5.5, qt 4.7.4.

Это также может произойти, если ваш плагин QMYSQL связан с" неправильным " mysql_client.a или он не находится в LD_LIBRARY_PATH. У меня была эта проблема на OSX, потому что mysql был установлен через порты, и я исправил его с:

Читайте также: