Qsqldatabase qsqlite driver not loaded windows

I am using VS2008 & QT plugin to make my application. After making package when I am running the application I am getting error : QSqlDatabase: QSQLITE driver not loaded QSqlDatabase: available

I am using VS2008 & QT plugin to make my application. After making package when I am running the application I am getting error :

QSqlDatabase: QSQLITE driver not loaded
QSqlDatabase: available drivers: 
Database error: QSqlError(-1, "Driver not loaded", "Driver not loaded") 
QSqlError(-1, "Driver not loaded", "Driver not loaded") 

I have added the qsqlite.dll to my package & also changed the libpath. But still I am getting this error. How to solve this.

My Code::

  QStringList str;
str.append(".");
a.setLibraryPaths(str);
a.addLibraryPath("./sqldrivers/");

//a.addLibraryPath(".");

qDebug()<<"my library path : "<<a.libraryPaths();

QLibrary sqlib("qsqlite4.dll");
sqlib.load();
qDebug()<<"my library loaded"<<sqlib.isLoaded();

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
qDebug()<<"Database error:"<<db.lastError();

db.setDatabaseName("vimukti1234");
qDebug()<< db.lastError();

 db.open();
QSqlQuery query;

qdot's user avatar

qdot

6,1255 gold badges43 silver badges94 bronze badges

asked Mar 1, 2011 at 6:37

amrit_neo's user avatar

1

The drivers need to be placed under «sqldrivers», not in the same directory as the executable (they are loaded on runtime, and Qt looks for them in «sqldrivers»).
A typical structure of one of our installed applications is like this:

.:
total 26616
-rwxr-xr-x 1 root root 2245632 Sep 29 03:53 AlvaEditor.exe
-rwxr-xr-x 1 root root 2335232 Sep 29 03:53 QtCore4.dll
-rwxr-xr-x 1 root root 8421376 Sep 29 03:53 QtGui4.dll
-rwxr-xr-x 1 root root  199168 Sep 29 03:53 QtSql4.dll
-rwxr-xr-x 1 root root  306688 Sep 29 03:53 libctemplate.dll
-rwxr-xr-x 1 root root   26624 Sep 29 03:53 qgif4.dll
-rwxr-xr-x 1 root root   28672 Sep 29 03:53 qico4.dll
-rwxr-xr-x 1 root root  200704 Sep 29 03:53 qjpeg4.dll
-rwxr-xr-x 1 root root  222720 Sep 29 03:53 qmng4.dll
-rwxr-xr-x 1 root root  439808 Sep 29 03:53 qsqlite4.dll
-rwxr-xr-x 1 root root   21504 Sep 29 03:53 qsvg4.dll
-rwxr-xr-x 1 root root  287232 Sep 29 03:53 qtiff4.dll
drwxr-xr-x 2 root root    4096 Sep 29 03:53 sqldrivers

./sqldrivers:
total 432
-rwxr-xr-x 1 root root 439808 Sep 29 03:53 qsqlite4.dll

answered Mar 4, 2011 at 6:20

qdot's user avatar

qdotqdot

6,1255 gold badges43 silver badges94 bronze badges

2

Well, the function: addDatabase(«QSQLITE»); takes two parameters, the first is the driver and the second is the name of your connection, (passed as a QString)

Now, try the following:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "SQLITE");

It worked for me, so I guess it’ll work for you. (Assuming SQLITE is among your installed drivers)

You can check for SQLITE by the following:

qDebug()  <<  QSqlDatabase::drivers();

Good luck!

Zaher J.G.

p-a-o-l-o's user avatar

p-a-o-l-o

9,6372 gold badges22 silver badges34 bronze badges

answered Jul 19, 2014 at 2:31

Zaher's user avatar

ZaherZaher

411 bronze badge

Just Add dll file which have folder life platform and drivesr

so simply build app using windeployqt tool

answered Jul 30, 2018 at 23:04

Dnyaneshwar's user avatar

DnyaneshwarDnyaneshwar

1221 gold badge3 silver badges11 bronze badges

Linux platform:
Build your Qt Source with the BR2_PACKAGE_QT5BASE_SQLITE_QT=y option enabled in .config file, and copy sqldrivers generated in output path lib/qt/plugins/sqldrivers/libqsqlite.so to /usr/lib/qt/plugins/sqldrivers/ on Target board and run your application.
Also you can Check where and all your binary/application looks for libraries and plugins using «QApplication::libraryPaths()» API

answered Jun 21, 2019 at 10:21

Rukmananda Reddy's user avatar

I got the same error

QSqlDatabase: SQLite driver not loaded
QSqlDatabase: available drivers:

SQLite driver are in QT(install_dir)>6.1.3>mingw81_64>plugins>sqldrivers>qsqlite.dll

Dont know why but after this it worked.

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "SQLITE");

Community's user avatar

answered Sep 23, 2021 at 11:55

eziobit's user avatar

Try this first:

qDebug() << QSqlDatabase::drivers();

to check available Drivers.

Anatoliy Nikolaev's user avatar

answered Mar 26, 2014 at 5:54

Harshi Srivastava's user avatar

Hi all, this is my first post for asking for anything programming related, so please forgive me if I’m missing something.

I’m doing a project for school that requires CRUD functionality; however, none of the databases are working for QT.

Here’s what I’m doing to connect to the database:
«`

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "SQLITE");
    QString dbName = "path/database.sqlite";
    db.setDatabaseName(dbName);
    qDebug() << db.connectionName();


    if (!db.open())
    {
        qDebug() << "There was an error opening the file";
    }
    else
    {
       qDebug() << QSqlDatabase::drivers();
       qDebug() << "Database opened successfully!";

       QSqlQuery q;
       q.exec("select * from login");
       while(q.next())
        {
            int id = q.value(0).toInt();
            qDebug() << id; /*testing to see if the console will return any of the entry_ids from the file*/
        }

When doing this, I get the error :

QSqlQuery::exec: database not open
There was an issue opening the database
QSqlError("", "Driver not loaded", "Driver not loaded")

Can someone help with troubleshooting the drivers? I’ve tried the steps in the QT SQLITE DRIVER setup, but do not have the nmake command available for use in terminal. Read more here: https://doc.qt.io/qt-5/sql-driver.html#qsqlite.

SPECS:
Qt Creator 4.13.3
Based on Qt 5.15.2 (Clang 11.0 (Apple), 64 bit)
Built on Nov 13 2020 12:39:07
MAC OSX 11.0.1 Beta (20B5022a)

bio4

2 / 2 / 3

Регистрация: 15.10.2015

Сообщений: 19

1

05.03.2017, 16:35. Показов 9224. Ответов 10

Метки нет (Все метки)


C++ (Qt)
1
2
3
4
5
6
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QSqlError>
#include <QDebug>
#include <QFileDialog>
C++ (Qt)
1
2
3
4
5
QSqlDatabase db;
db = QSqlDatabase::addDatabase("QSQLITE");
QMessageBox msgBox1;
msgBox1.setText(""+db.lastError().text());
msgBox1.exec();

скопировал в директорию с .exe файлом файл «QtCore4.dll»
и на моей машине нормально рабатает после релизной сборки.
Но если на убрать на время каталог с QT(«QtSDK»)
то QSqlDatabase уже не работает

Изображения

 

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



7275 / 6220 / 2833

Регистрация: 14.04.2014

Сообщений: 26,871

05.03.2017, 17:56

2

А dll SQLite перенёс?



1



2 / 2 / 3

Регистрация: 15.10.2015

Сообщений: 19

05.03.2017, 18:46

 [ТС]

3

Цитата
Сообщение от nmcf
Посмотреть сообщение

А dll SQLite перенёс?

QtSql4.dll уже был
толь ко что добавил
qsqlite4.dll
qsqlited4.dll
но результат тот-же

P.S. даже если я переброшу все содержимое каталога QtSDKDesktopQt4.7.4mingwbin, то проблему это не решает



0



7275 / 6220 / 2833

Регистрация: 14.04.2014

Сообщений: 26,871

05.03.2017, 18:51

4

Лучший ответ Сообщение было отмечено bio4 как решение

Решение

Не уверен насчёт Qt4, но в Qt5 должна быть папка sqldrivers там, где само приложение, и в ней dll.



1



2 / 2 / 3

Регистрация: 15.10.2015

Сообщений: 19

05.03.2017, 19:01

 [ТС]

5

Цитата
Сообщение от nmcf
Посмотреть сообщение

в Qt5 должна быть папка sqldrivers там, где само приложение, и в ней dll

нет не помогло



0



7275 / 6220 / 2833

Регистрация: 14.04.2014

Сообщений: 26,871

05.03.2017, 19:02

6

Всю структуру файлов и папок, которые переносишь, покажи.



0



2 / 2 / 3

Регистрация: 15.10.2015

Сообщений: 19

05.03.2017, 19:08

 [ТС]

7

Цитата
Сообщение от nmcf
Посмотреть сообщение

Всю структуру файлов папок

вот

Миниатюры

На машине клиента "QSQLITE" выдает: Driver not loaded Driver not loaded
 



0



7275 / 6220 / 2833

Регистрация: 14.04.2014

Сообщений: 26,871

05.03.2017, 19:39

8

Лучший ответ Сообщение было отмечено bio4 как решение

Решение

В каком именно месте этот фрагмент вставлен? QApplication уже инициализировался?



0



2 / 2 / 3

Регистрация: 15.10.2015

Сообщений: 19

05.03.2017, 19:48

 [ТС]

9

Цитата
Сообщение от nmcf
Посмотреть сообщение

QApplication уже инициализировался?

Да
на моем ПК exe запускается и после нажатия кнопки нормально подключаючается к базе и все хорошо
на другом ПК exe тоже запускается, но после нажатия кнопки сообщение содержит текст выше, и запросы к базе не работают



0



7275 / 6220 / 2833

Регистрация: 14.04.2014

Сообщений: 26,871

05.03.2017, 20:21

10

Лучший ответ Сообщение было отмечено bio4 как решение

Решение

Проверь зависимости, может что-то ещё нужно. Древняя версия, могут быть отличия от qt5.



1



2 / 2 / 3

Регистрация: 15.10.2015

Сообщений: 19

05.03.2017, 21:38

 [ТС]

11

Цитата
Сообщение от nmcf
Посмотреть сообщение

должна быть папка sqldrivers там, где само приложение, и в ней dll

Цитата
Сообщение от nmcf
Посмотреть сообщение

dll SQLite

Да вы были правы, все деле в том что нужно мне было мене взять qsqlite4.dll не из QtSDKDesktopQt4.7.4mingwbin,
а из QtSDK1DesktopQt4.7.4mingwpluginssqldrivers и добавил в директорию sqldrivers

это я узнал из программы «PE Tools»

Миниатюры

На машине клиента "QSQLITE" выдает: Driver not loaded Driver not loaded
 



0



Дано
ОС Windows 7 или 10 x64
Qt5.5.1 (mingw) (x86) или новее
PostgreSQL 10 или новее

Задача
Заставить разработанное на Qt приложение запускаться на машине без установленного Qt и PostgreSQL и подключаться к СУБД PostgreSQL.

При вызове QSqlDatabase::addDatabse(«QPSQL») программа пишет:

QSqlDatabase: QPSQL driver not loaded

QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7

либо вовсе:

QSqlDatabase: QPSQL driver not loaded

QSqlDatabase: available drivers:

Анализ

Как в общих чертах происходит работа с БД в Qt:
Функция QSqlDatabase::addDatabse живет в Qt5Sql.dll, и при вызове пытается динамически подгрузить qsqlpsql.dll, которая тянет за собой кучу других dll, часть из которых живет в составе PostgreSQL.

Разберемся, как решать эту и подобные проблемы, связанные с dll.

Принципиально существует два способа связывания dll и exe-файлов: явное и неявное. При загрузке SQL-драйверов Qt задействованы оба способа.
Сначала при запуске exe-файла происходит поиск и загрузка требуемых dll-библиотек, в т.ч. Qt5Sql.dll. Если какие-то библиотеки не найдены, то при запуске программы Windows сообщит об этом.

В процессе работы программы при вызове QSqlDatabase::addDatabse делается динамический поиск dll-файлов SQL-драйверов в определенных каталогах. Для драйвера QPSQL должна быть найдена библиотека qsqlpsql.dll, после чего выполняется попытка ее загрузки.

Для этого загружаются другие неявно связанные с ней dll-библиотеки вместе со своими зависимостями. Если всё дерево необходимых dll-библиотек найдено, то qsqlpsql.dll будет успешно загружена и Qt сможет использовать этот драйвер.

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

Разбираемся

Нам надо выяснить, какие dll-библиотеки требуются для работы программы и куда их нужно положить.

Для этого достаточно в общих чертах представлять, как Windows ищет dll, а именно, что сначала производится поиск в каталоге exe-файла, а в конце — по путям, указанным в переменной окружения PATH. PATH удобно использовать на машине разработчика, но этот вариант рассматривать не будем т.к. это не соответствует изначальной задаче. 

Также надо знать, в каких каталогах QSqlDatabase::addDatabse ищет драйверы SQL. Существуют способы указать Qt альтернативные пути, где искать плагины (в т.ч. SQL), но не будем заниматься и этим.

Исследуем

Используем Прекрасную программы DependencyWalker, которая показывает дерево зависимостей dll и exe-файлов.

Сначала открываем с помощью неё исполняемый файл программы и смотрим, какие dll-библиотеки должны быть доступны, ищем их в каталоге установки Qt и компилятора и кладем рядом с исполняемым файлом. Теперь программа должна запускаться и доходить до вызова QSqlDatabase::addDatabse.

Чтобы увидеть, где Qt ищет SQL-драйверы, добавляем переменную окружения QT_PLUGIN_PATH = 1 (например, в настройках параметров запуска приложения в QtCreator), запускаем программу и изучаем ее вывод. Кроме прочего должны быть примерно такие строки:

QFactoryLoader::QFactoryLoader() checking directory path «C:/Qt/Qt5.5.1/5.5/mingw492_32/plugins/sqldrivers»

QFactoryLoader::QFactoryLoader() checking directory path «C:/projects/build-foobar-Desktop-Release/release/sqldrivers»

Из них становится ясно, что по умолчанию Qt ищет SQL-драйверы в каталоге установки и в подкаталоге sqldrivers рядом с exe-файлом. Поэтому находим qsqlpsql.dll в каталоге установки Qt (примерно в C:Qt5.5.1mingw491_32binpluginssqldrivers) и копируем в подкаталог sqldrivers рядом с exe-файлом.
Если все сделано верно, то после вызова QSqlDatabase::addDatabse должно вывестись:

QSqlDatabase: available drivers: QPSQL QPSQL7

Если не удалось, то попробовать положить qsqlpsql.dll в plugins/sqldrivers.

Далее с помощью DependencyWalker исследуем зависимости qsqlpsql.dll.

Кроме зависимостей от библиотек Qt и компилятора, будет зависимость от libpq.dll.

Проще всего взять libpq.dll из каталога установки PostgreSQL (примерно в C:Program Files (x86)PostgreSQL10bin). Здесь есть две важнейшие особенности:

1) разрядность libpq.dll должна совпадать с разрядностью приложения. Под Windows стандартный SDK Qt5 с официального сайта 32-разрядный. т.е. необходима 32-разрядная версия libpq.dll, которую можно взять из x86-версии PostgreSQL. Это не влияет на разрядность сервера PostgreSQL, к которому будет подключаться приложение;

2) libpq.dll необходимо располагать рядом с exe-файлом, а не рядом с qsqlpsql.dll. Все остальные dll, от которых зависит libpq.dll, необходимо класть также рядом с exe-файлом приложения.

Теперь все тем же DependencyWalker исследуем зависимости libpq.dll в каталоге установки PostgreSQL.

В зависимости от версии PostgreSQL у libpq.dll могут быть разные dll-зависимости. Находим их все в каталоге установки PostgreSQL и копируем рядом с exe-файлом. Не забываем пройтись по всем зависимостям всех добавляемых dll. 

Сравниваем

Из установленного PostgreSQL 9.4 нужно позаимствовать следующие библиотеки:

libpq.dll

ssleay32.dll

libeay32.dll

libintl-8.dll

libiconv-2.dll

Для PostgreSQL 10 набор уже другой:

libpq.dll

libssl-1_1.dll

libcrypto-1_1.dll

libintl-8.dll

libiconv-2.dll

Более новые версии PostgreSQL выпускаются только в редакции x64, поэтому для получения x86-версии libpq.dll и других библиотек, возможно, придется собирать их из исходников самостоятельно (я не пробовал).

Что еще
возможно, Вам, как и мне, потребуется откуда-то добыть msvcr120.dll (или что-то вроде того в новых версиях Windows и PostgreSQL) и тоже бросить рядом с exe-файлом.

Итого
У меня получилась следующая структура каталога простой консольной программы, выполняющей загрузку драйвера БД:

qpsqltest.exe

sqldrivers/qsqlpsql.dll

Qt5Core.dll

Qt5Sql.dll

libpq.dll

libssl-1_1.dll

libcrypto-1_1.dll

libintl-8.dll

libiconv-2.dll

libwinpthread-1.dll

libstdc++-6.dll

libgcc_s_dw2-1.dll

msvcr120.dll

Архив c примером на гуглодиске

Автор Тема: [РЕШЕНО] QSQLITE driver not loaded  (Прочитано 12214 раз)
LisandreL

Птица говорун
*****
Offline Offline

Сообщений: 984

Надо улыбаться

Просмотр профиля


Извините, что взываю к помощи экстрасенсов.
Есть сравнительно большой проект.
И вот в один не особо прекрасный день он перестал подхватывать sqldrivers/qsqlite4.dll
То есть на компьютере, где установлен кьют всё прекрасно, но стоит взять чистый компьютер (или просто переименовать папку QtSDK) и драйвер не загружается.

Тестовый пример прекрасно подхватывает драйвер из sqldrivers/qsqlite4.dll, что впрочем до определённого момента делал и сам проект.

Может будут хотя бы идеи из-за чего это может происходить. Из-за порядка инициализации чего-то? Из-за изменения приложением текущей папки?..

« Последнее редактирование: Ноябрь 15, 2011, 09:22 от LisandreL »
Записан
andrew.k

Гость


попробуй положить плагин рядом с приложением в директорию sqldrivers

Т.е. вот так:

/sqldrivers/qsqlite4.dll
/app.exe


Записан
andrew.k

Гость


или у тебя тестовый пример работает, а приложение нет?
или оба теперь не работают?


Записан
LisandreL

Птица говорун
*****
Offline Offline

Сообщений: 984

Надо улыбаться

Просмотр профиля


попробуй положить плагин рядом с приложением в директорию sqldrivers

Т.е. вот так:

/sqldrivers/qsqlite4.dll
/app.exe

Именно так оно и лежит.
Не находит драйвер.
На тестовом мини-проекте работает, на основном — нет.


Записан
andrew.k

Гость


Тогда, конечно, смотри текущую папку.
Если у тебя она меняется, как же он ее найдет?

« Последнее редактирование: Ноябрь 15, 2011, 00:40 от andrew.k »
Записан
andrew.k

Гость


или раз уж меняешь текущую директорию клади в $QTDIR/plugins/sqldrivers/qsqlite4.dll
хотя он и так должен там лежать по идее, если qt установлен.


Записан
andrew.k

Гость


сейчас посмотрел в dll dependency qsqlite4.dll
Там вот что (проверь, что у тебя все на месте):

mingwm10.dll
libgcc_s_dw2-1.dll
QtCore4.dll
QtSql4.dll


Записан
LisandreL

Птица говорун
*****
Offline Offline

Сообщений: 984

Надо улыбаться

Просмотр профиля


Да, ещё gui и network.

или раз уж меняешь текущую директорию клади в $QTDIR/plugins/sqldrivers/qsqlite4.dll

Не ствить же на все компы Qt в нагрузку к программе…
Да и папку я по идее не должен менять, просто была идея «а вдруг», но проверка показывает, что всё нормально.

Видать прийдётся в svn-е искать последнюю работавшую версию и пытаться по диффам понять, что же я сломал.


Записан
LisandreL

Птица говорун
*****
Offline Offline

Сообщений: 984

Надо улыбаться

Просмотр профиля


Разобрался. Проблема возникала из-за обращения к БД до создания QApplication.
Пути к этому моменту ещё не инициализированнный и драйвер не находится. Повторно искать его программа уже не пытается.


Записан

If you’re trying to use Postgres with PyQt5/6 or PySide2/PySide6 you may have come across an issue with loading the driver.
Qt (correctly) lists the driver as available in Qt, but when trying to load it the load will fail. This is because the Qt
library depends on Postgres’ own library, which must be available in the path to load.

The following script will let you test if the Postgres library is loading correctly.

  • PyQt5
  • PyQt6
  • PySide2
  • PySide6

python

from PyQt5.QtSql import QSqlDatabase
from PyQt5.QtWidgets import QApplication

app = QApplication([])

db = QSqlDatabase("QPSQL")
print("Available drivers", db.drivers())

if not db.open():
    print("Unable to connect.")
    print('Last error', db.lastError().text())
else:
    print("Connection to the database successful")

python

from PyQt6.QtSql import QSqlDatabase
from PyQt6.QtWidgets import QApplication

app = QApplication([])

db = QSqlDatabase("QPSQL")
print("Available drivers", db.drivers())

if not db.open():
    print("Unable to connect.")
    print('Last error', db.lastError().text())
else:
    print("Connection to the database successful")

python

from PySide2.QtSql import QSqlDatabase
from PySide2.QtWidgets import QApplication

app = QApplication([])

db = QSqlDatabase("QPSQL")
print("Available drivers", db.drivers())

if not db.open():
    print("Unable to connect.")
    print('Last error', db.lastError().text())
else:
    print("Connection to the database successful")

python

from PySide6.QtSql import QSqlDatabase
from PySide6.QtWidgets import QApplication

app = QApplication([])

db = QSqlDatabase("QPSQL")
print("Available drivers", db.drivers())

if not db.open():
    print("Unable to connect.")
    print('Last error', db.lastError().text())
else:
    print("Connection to the database successful")

Executing the above script in a new command prompt will give the following
output (if Postgres is not accessible).

command

>python test.py
QSqlDatabase: QPSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7
Available drivers ['QSQLITE', 'QODBC', 'QODBC3', 'QPSQL', 'QPSQL7']
Unable to connect.
Last error Driver not loaded Driver not loaded

The list of «available drivers» shows the Qt drivers which are available in your PyQt5 (or PyQt6, or PySide2, or PySide6) installation. For example, in my installation the driver files are under site-packagesPyQt5Qt5pluginssqldrivers

command

C:UsersMartinAppDataLocalProgramsPythonPython37Libsite-packagesPyQt5Qt5pluginssqldrivers> dir

 Volume in drive C has no label.
 Volume Serial Number is 0A6A-65ED

 Directory of C:UsersMartinAppDataLocalProgramsPythonPython37Libsite-packagesPyQt5Qt5pluginssqldrivers

02/12/2021  14:35    <DIR>          .
02/12/2021  14:35    <DIR>          ..
02/12/2021  14:35         1,412,080 qsqlite.dll
02/12/2021  14:35            98,288 qsqlodbc.dll
02/12/2021  14:35            79,856 qsqlpsql.dll
               3 File(s)      1,590,224 bytes
               2 Dir(s)  174,429,970,432 bytes free

The Driver not loaded error is occurring because the Qt Postgres driver cannot find the Postgres libraries. The Qt Postgres driver is a wrapper around these libraries, rather than a complete implementation of Postgres itself.

To get this working you need to ensure the required Postgres library files are available in your path.
You can do this by adding your Postgres installation bin folder to your path. For example, on my computer Postgres is installed under C:Program FilesPostgreSQL14 (I’m using version 14). We need to add to the Postgres bin folder to the PATH as this contains libpq.dll (Postgres Access Library) which Qt needs.

command

SET PATH=%PATH%;C:Program FilesPostgreSQL14bin

With that in place, running the script again will show that that driver has loaded successfully. The
connection still isn’t working, since it needs the username and password set. But if you get this far
you know the driver is working properly.

command

U:homemartinwwwpythonguiscontentfaqqt-postgres-driver>python test.py
Available drivers ['QSQLITE', 'QODBC', 'QODBC3', 'QPSQL', 'QPSQL7']
Unable to connect.
Last error connection to server at "localhost" (::1), port 5432 failed: fe_sendauth: no password supplied
QPSQL: Unable to connect

We can modify the test script to add your username and password to complete the connection.

  • PyQt5
  • PyQt6
  • PySide2
  • PySide6

python

from PyQt5.QtSql import QSqlDatabase
from PyQt5.QtWidgets import QApplication

app = QApplication([])

db = QSqlDatabase("QPSQL")
db.setUserName("postgres")  # postgres is the default root username
db.setPassword("")    # add your password here
print("Available drivers", db.drivers())

if not db.open():
    print("Unable to connect.")
    print('Last error', db.lastError().text())
else:
    print("Connection to the database successful")

python

from PyQt6.QtSql import QSqlDatabase
from PyQt6.QtWidgets import QApplication

app = QApplication([])

db = QSqlDatabase("QPSQL")
db.setUserName("postgres")  # postgres is the default root username
db.setPassword("")    # add your password here
print("Available drivers", db.drivers())

if not db.open():
    print("Unable to connect.")
    print('Last error', db.lastError().text())
else:
    print("Connection to the database successful")

python

from PySide2.QtSql import QSqlDatabase
from PySide2.QtWidgets import QApplication

app = QApplication([])

db = QSqlDatabase("QPSQL")
db.setUserName("postgres")  # postgres is the default root username
db.setPassword("")    # add your password here
print("Available drivers", db.drivers())

if not db.open():
    print("Unable to connect.")
    print('Last error', db.lastError().text())
else:
    print("Connection to the database successful")

python

from PySide6.QtSql import QSqlDatabase
from PySide6.QtWidgets import QApplication

app = QApplication([])

db = QSqlDatabase("QPSQL")
db.setUserName("postgres")  # postgres is the default root username
db.setPassword("")    # add your password here
print("Available drivers", db.drivers())

if not db.open():
    print("Unable to connect.")
    print('Last error', db.lastError().text())
else:
    print("Connection to the database successful")

…and then the connection will complete as expected.

command

>python test-userpass.py
Available drivers ['QSQLITE', 'QODBC', 'QODBC3', 'QPSQL', 'QPSQL7']
Connection to the database successful

Over 10,000 developers have bought Create GUI Applications with Python & Qt!

[[ discount.discount_pc ]]% OFF for [[discount.description ]]
with the code [[ discount.coupon_code ]]

В процессе использования Qt для работы с базой данных MySQL после использования Qt для написания кода для подключения к базе данных MySQL во время компиляции и отладки выдается сообщение об ошибке QSqlDatabase: драйвер QMYSQL не загружен, что означает, что приложению Qt не удается подключиться к базе данных MySQL. Ошибка показана на рисунке ниже:

("QSQLITE", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7
"Driver not loaded Driver not loaded"

Среда разработки этого проекта (решения):

(1) Операционная система: Windows10

(2) Версия MySQL: 8.0MySql скачать

(3) Версия Qt: 5.14.1Qt5.14.1 скачать

(4) Версия QtCreator: 4.11.0

Проанализировать причину «QSqlDatabase: драйвер QMYSQL не загружен»

Согласно сообщению об ошибке на изображении выше, проверьте официальный документ, ссылка:https://doc.qt.io/qt-5/sql-driver.html#qmysql-for-mysql-4-and-higher,Получите соответствующую информацию следующим образом

(1) Модуль Qt SQL использует подключаемый модуль драйвера для связи с различными API баз данных.

(2) Поддерживаются следующие базы данных:

Driver name DBMS
QDB2 IBM DB2 (version 7.1 and above)
QIBASE Borland InterBase
QMYSQL MySQL (version 5.0 and above)
QOCI Oracle Call Interface Driver
QODBC Open Database Connectivity (ODBC) — Microsoft SQL Server and other ODBC-compliant databases
QPSQL PostgreSQL (versions 7.3 and above)
QSQLITE2 SQLite version 2Note: obsolete since Qt 5.14
QSQLITE SQLite version 3
QTDS Sybase Adaptive ServerNote: obsolete since Qt 4.7

Согласно сообщению об ошибке, доступны следующие драйверы: QSQLITE QODBC QODBC3 QPSQL QPSQL7, а драйвер QMYSQL отсутствует. Итак, причины проблемы с позиционированием:Отсутствие драйвера QMYSQL.

Скомпилировать драйвер MySQL

(1) Скомпилируйте драйвер

Проверьте путь установки Qt на компьютере: E: ProgramData Qt Qt5.14.1 5.14.1 mingw73_64 plugins sqldrivers подключаемый модуль sqldrivers, как показано ниже

[Не удалось передать изображение по внешней ссылке. На исходном сайте может быть механизм защиты от хотлинкинга. Рекомендуется сохранить изображение и загрузить его напрямую (img-j5HUM609-1583739250397) (C: Users AdminCode AppData Roaming Typora typora-user-images image-20200309150658854.png)]

Обнаружено, что нет подключаемого модуля драйвера, связанного с MySQL.

Исходная версия Qt5.13 не включает плагин драйвера для управления MySQL, поэтому вам нужно скомпилировать плагин самостоятельно. Процесс компиляции плагина выглядит следующим образом:

1. Используйте QtCreator, чтобы открыть проект mysql.proE:ProgramDataQtQt5.14.15.14.1Srcqtbasesrcpluginssqldriversmysql

Откройте файл проекта (исходное содержимое) следующим образом.

Модификация элемента управления выглядит следующим образом

Дайте код, скопируйте и замените самостоятельно

TARGET = qsqlmysql

HEADERS += $$PWD/qsql_mysql_p.h
SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp

#QMAKE_USE += mysql

OTHER_FILES += mysql.json

PLUGIN_CLASS_NAME = QMYSQLDriverPlugin
include(../qsqldriverbase.pri)
# Путь - это путь к файлу заголовка Mysql (включая)
INCLUDEPATH +="E:Program FilesMySQLmysql-8.0.18-winx64include"
 # Это путь к файлу библиотеки MySQl
LIBS +="E:Program FilesMySQLmysql-8.0.18-winx64liblibmysql.lib"
 # Для облегчения поиска вы можете добавить оператор, который используется для указания местоположения скомпилированного результата
DESTDIR = ../mysql/lib/

Скомпилируйте программу после ее добавления (примечание: здесь используется бит MinGw64)

После успешной компиляцииE:ProgramDataQtQt5.14.15.14.1SrcqtbasesrcpluginssqldriversmysqlПод каталогом будет дополнительный каталог lib

2. Скопируйте эти три файла вE:ProgramDataQtQt5.14.15.14.1mingw73_64pluginssqldriversв

(2) Добавить пакет расширения MySql

Добавить пакет расширения для подключения к MySQLlibmysql.dllс участиемlibmysql.lib, Этот пакет находится в нашем каталоге установки MySqlE:Program FilesMySQLmysql-8.0.18-winx64libв;
Добавьте пакет расширения в каталог установки QtE:ProgramDataQtQt5.14.15.14.1mingw73_64binв:

Пока что Qt может подключаться к базе данных MySQL.

Как следует из названия, у меня есть эта проблема в течение нескольких дней. Моя программа прекрасно работает в режиме отладки на QtCreator, но как только я выбираю режим выпуска, я получаю проблему с незакрепленным драйвером sql (я только запускал его на Windows 10). Я считаю, что мой .pro файл написан правильно (QT + = sql написано).

Я перепробовал большинство вещей, которые мог:

  • windeployqt.exe.
  • Переместить плагины в подпапку sqldrivers в исполняемую папку, содержащую все sqldrivers, предоставленные путем установки Qt, а также в исполняемую папку Qt5Sql.dll
  • Я также попытался использовать файл sqlite3.dll, предоставленный веб-сайтом sqlite, и переместить его в одну (проверенную по одному) исполняемую папку и подпапку sqldrivers.

Как я уже сказал, проблема возникает только при развертывании, поэтому мне интересно, есть ли что-то, что я должен был добавить в свой файл .pro.
У меня не установлена ​​программа sql на моей ОС Windows. Если это проблема, о которой я думаю, мне было бы интересно, как заставить мою программу использовать плагины из подпапки sqldrivers.

Ошибки:

QSqlDatabase: QSQLITE driver not loaded
QSqlDatabase: available drivers:
QSqlDatabase: an instance of QCoreApplication is required for loading driver plugins
QSqlQuery::exec: database not open

РЕДАКТИРОВАТЬ: Мне удалось это исправить. Проблема возникла из-за того, чего я не ожидал. Я использовал глобальные переменные, и одна из них была моей базой данных, я понял это, снова прочитав ошибку, так как казалось, что база данных была загружена до первых строк main.cpp (в #include). Так что сейчас я использую открытие и закрытие базы данных каждый раз, когда я ее использую. Можно ли как-то объявить глобальную базу данных (держать ее открытой все время)? Я использую это довольно интенсивно.

0

Решение

Да, вы можете открыть свою базу данных один раз а затем просто использовать статические публичные методы QSqlDatabase учебный класс:

QSqlDatabase my_db = QSqlDatabase::addDatabase("QSQLITE");
my_db.setDatabaseName("my_db_name.sqlite");

if(my_db.open())
{
my_db.exec("create table person (id int primary key, ""firstname varchar(20), lastname varchar(20))");
}
else
{
qDebug() << my_db.lastError().text();
}

А потом в другом месте:

QSqlDatabase db = QSqlDatabase::database();

if(db.isOpen())
{
qDebug() << "Wow";
db.exec("insert into person values(101, 'Danny', 'Young')");
}

Увидеть QSqlDatabase::addDatabase(), и использовать параметр connectionName если необходимо.

0

Другие решения

Других решений пока нет …

Понравилась статья? Поделить с друзьями:
  • Qsqldatabase qpsql driver not loaded windows 10
  • Qsqldatabase qmysql driver not loaded windows
  • Qsoft ramdisk enterprise установка на windows 10
  • Qscalp не удалось проверить статус лицензии windows 10
  • Qrm plus manager rus скачать для windows 10