Как установить драйвер qpsql в qt

Обновлено: 06.07.2024

Для работы Qt с СУБД PostgreSQL , кроме драйвера ODBC можно (а в некоторых случаях необходимо) использовать драйвер QPSQL . Но в виде скомпилированной библиотеки изначально его нет, потому сначала его необходимо собрать из исходников.

В статье пойдёт речь о сборке драйвера QPSQL в среде ОС MS Windows .

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

Требования

  • ОС:
    • Microsoft Windows 7 Professional x32 ;
    • Microsoft Windows 7 Professional x64 ;
    • Microsoft Windows XP Home x32 ;

    Однако, это не означает, что на других версиях ОС и ПО ничего не получится. Здесь приведены лишь проверенные.

    В системную переменную PATH должны быть добавлены следующие пути:

    • D:\Programs\Qt\Desktop\Qt\4.8.1\mingw\bin ;
    • D:\Programs\Qt\mingw\bin ;
    • D:\Programs\PostgreSQL\bin ;
    • D:\Programs\PostgreSQL\include ;
    • D:\Programs\PostgreSQL\lib .

    После этого можно (и желательно) перезагрузить компьютер.

    Пути до файлов библиотек и утилит Qt , в общем-то, не обязательны, но всё же не повредит добавить их в PATH .

    Сборка

    На самом деле, всё очень просто. Исходники драйвера QPSQL лежат в каталоге QtSources , достаточно лишь открыть его проектный файл в QtCreator и выполнить сборку.

    Однако, это звучит слишком просто, чтобы быть правдой. И в самом деле - есть ряд некоторых нюансов.

    Идём в D:\Programs\Qt\QtSources\4.8.1\src\plugins\sqldrivers\psql\ .

    Там лежит файл проекта psql.pro , открываем его в QtCreator . Он выцепит вместе с собой все остальные необходимые проекты. Нам надо изменить проект D:\Programs\Qt\QtSources\4.8.1\src\sql\drivers\psql\qsql_psql.pri (только не на диске его искать и открывать в блокноте, а именно тут, в проекте - в дереве файлов проекта развернуть ветку psql и редактировать файл проекта), комментируем в нём следующие строки:

    Теперь дописываем следующее в файл проекта psql.pro :

    Если INCLUDEPATH не сработает, и он потребует заголовочные файлы, то найдите их по именам в каталоге D:\Programs\PostgreSQL\include\ и скопируйте в каталог с проектом D:\Programs\Qt\QtSources\4.8.1\src\plugins\sqldrivers\psql\ .

    То же касается и библиотеки. Если не подхватит, то идём в D:\Programs\PostgreSQL\lib\ и копируем оттуда libpq.dll в D:\Programs\Qt\QtSources\4.8.1\src\plugins\sqldrivers\psql\ .

    Теперь можно выполнить сборку. Кстати, выполните обе сборки: и debug , и release .

    Получившиеся qsqlpsqld4.dll и qsqlpsql4.dll поместите в D:\Programs\Qt\Desktop\Qt\4.8.1\mingw\plugins\sqldrivers\ .

    Теперь не забудьте вернуть назад все изменения в файлах psql.pro и qsql_psql.pri .

    Проверка

    Создаём проект для проверки - GUI-приложение, например. Кнопка и текстовое поле. По нажатию на кнопку в поле будут выводиться имена всех имеющихся драйверов и осуществляться попытка добавить базу данных с драйвером QPSQL .

    В файле проекта дописать:

    В исходниках формы на обработчик кнопки:

    Prodlenka.qt.psql.pic1.jpg

    Загрузить исходники проверочного проекта можно здесь.

    Если по материалам статьи ничего не получилось, то попробуйте сделать по этой инструкции. У автора статьи, однако, ничего не получилось как раз по ней, после чего был опробован описываемый способ и написана настоящая статья.

    QPSQL доступен, но не загружается
    Помогите, пожалуйста =) В гугле много таких тем, но несколько попыток сделать, как там написано.


    QPSQL driver not loaded
    Здравствуйте, возникла проблема с подключением к Postgresql, подобная же проблема возникла с.

    QSqlDatabase: QPSQL driver not loaded
    Не пойму в чем дело, до этого на SQLite работало все хорошо. Решил перейти на Postgres. И тут.

    QSQLITE driver и QNX
    QSQLITE driver not loaded – ошибка на виртуальной машине с QNX. При запуске приложения Qt на ВМ.

    Да, в бесплатной версии есть не все драйвера. Для сборки драйвера нужно скачать заголовочники и библиотеки соответствующей СУБД, найти в папке sources исходники нужного драйвера, при сборке проекта указать пути к скачанным заголовочникам и библиотекам, потом положить собранные "драйвера" (по сути - библиотеки) в папку sqldrivers. потом положить собранные "драйвера" (по сути - библиотеки) в папку sqldrivers. или в папку с программой - в винде драйвер будет представлени .dll динамической библиотекой cd %QTDIR%\src\plugins\sqldrivers\psql
    qmake "INCLUDEPATH+=C:\psql\include" "LIBS+=C:\psql\lib\ms\libpq.lib" psql.pro
    nmake

    Я правильно понял, что сначала задается папка с исходниками драйвера, зачем прописываются пути к библиотекам PostgreSQL? Тогда остается вопрос, что за файл psql.pro, т.к. консоль пишет, что такого файла нет.

    Добавлено через 5 часов 4 минуты

    Да, в бесплатной версии есть не все драйвера. Для сборки драйвера нужно скачать заголовочники и библиотеки соответствующей СУБД, найти в папке sources исходники нужного драйвера, при сборке проекта указать пути к скачанным заголовочникам и библиотекам, потом положить собранные "драйвера" (по сути - библиотеки) в папку sqldrivers. Ребят, пожалуйста, можно поподробнее?
    Как выглядят эти заголовочники и библиотеки СУБД?
    И что это за легендарная папочка sources, в которой хрянятся исходники и которой у меня нет?
    Везде пишут, что сборка драйвера реализуется командами:

    Так почему у меня этой папки src вообще нет?
    И что это за psql.pro? Откуда он вообще и зачем?

    Уж простите за негодование, просто в печенках уже засел этот драйвер(
    2 дня потратил, ничего не добился(

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


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

    Решение
    Прекрасная программа DependencyWalker позволяет проследить все дерево зависимостей от Qt5Sql.dll и от qsqlpsql.dll. Рассмотрим по порядку.

    Qt5Sql.dll
    Тут все просто. Если Ваша тестовая (или не очень) программа скомпилировалась и запустилась, то все зависимости Qt5Sql.dll удовлетворены по определению и все хорошо.

    Поиск драйвера
    Если QSqlDatabase::drivers среди прочего выдает QPSQL, то все хорошо, файл qsqlpsql.dll доступен.
    Если нет, то его следует положить в папку "каталог_с_exe_файлом/plugins/sqldrivers/".
    Взять драйвер qsqlpsql.dll можно примерно в "C:\Qt\5.5.1\mingw491_32\bin\plugins\sqldrivers" -- точное положение зависит от версии Qt (в общем, поищите поиском). Если драйвера нет, то его следует собрать самому из исходников (инструкции есть в гугле).

    Если Вы все еще тут, значит при попытке подключения к БД получается ошибка "driver not loaded" -- значит процесс загрузки драйвера с его зависимостями провалился и проблема в том, что не ясно, из-за чего именно это произошло, поэтому идем дальше.

    qsqlpsql.dll
    Тут интереснее. qsqlpsql.dll, кроме прочего, зависит от библиотек, входящих в состав PostgreSQL. Значит надо сделать так, чтобы они были видны в момент загрузки драйвера.
    Варианты:
    - если установлен PostgreSQL, то можно добавить в системную переменную PATH путь к папке bin, находящейся внутри каталога установки PostgreSQL;
    - если нет, то нужно раздобыть необходимые dll из состава PostgreSQL и положить их рядом с Вашим exe-файлом (именно рядом, а не в каких-либо подпапках).
    В обоих случаях надо учитывать, что разрядность библиотек PostgreSQL должна соответствовать разрядности Qt и вашего приложения в частности. Т.е. если у Вас 32-разрядное приложение, то и dll надо брать из 32-разрядной версии PostgreSQL.
    (при этом, естественно, не имеет значения разрядность сервера СУБД PostgreSQL, к которому Ваше приложение пытается подключиться)

    Из установленного PostgreSQL нужно позаимствовать следующие библиотеки:
    libpq.dll
    ssleay32.dll
    libeay32.dll
    libintl-8.dll
    libiconv-2.dll

    Рекомендую пройтись DependencyWalker'ом от qsqlpsql.dll и libpq.dll чтобы быть уверенным, что в новых версиях PostgreSQL не появились новые зависимости.

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

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

    Для того чтобы начать разрабатывать собственное приложение(в редакторе Qt Creator), которое имеет возможность обращаться к некой базе данный, нужно прежде всего иметь редактор кода Qt и свободную объектно-реляционную систему управления базами данных(СУБД), в данном примере речь пойдет о такой СУБД, как PostgreSQL. Статья подразумевает тот факт, что разработчик имеет уже созданную базу данных, а также базовые навыки работы с С++.

    Перед началом работы у разработчика имеется множество путей подключения созданной базы данных к разрабатываемому приложению, но подробней речь пойдет о о двух: путем использования драйвера QPSQL или драйвера ODBC. Выбор остается за самим разработчиком, но так или иначе в 80% случаях возникает проблемы при использовании того или иного драйвера. Эта статья как раз рассказывает о спектре проблем, которые могут возникнуть, а также о том, как от них избавится.

    Перед тем, как остановиться на выборе драйвера требуется выполнить проверку наличия драйверов - это делается для того, чтобы выбор драйвера в дальнейшем был выгодней для Вас. Итак, для того, чтобы узнать, какие же драйверы могут работать с SQL нужно написать простенькое приложение которое будет выводить на консоль(консоль самого Qt) список драйверов с помощью команды qDebug() << QSqlDatabase::drivers(); после запуска мы сможем узнать, какие драйверы нам доступны. Если у Вас есть в наличии драйвер QPSQL, то рекомендуется использовать именного его, если нет, то QODBC. Также не забываем в фале с расширением .pro дописать QT += sql - это даст возможность Qt понимать SQL запросы.

    Если ваш выбор пришелся на QPSQL драйвер, то при наилучшем стечении обстоятельств подключение будет быстрым и безболезненным, стоит отметить, что будет все гладко, если драйвер уже есть в наличии. Стоит отметить сразу, что если вы используете СУБД НЕ PosgreSQL, то сразу переходите к описанию подключения базы с использованием драйвера QODBC. Для подключения рекомендуется использовать некоторую "кнопку"(как элемент интерфейса разрабатываемого приложения), поскольку так исключаться всевозможные "косяки", которые могут возникнуть при запуске и помешать коммутации. Чтобы осуществить подключение напишем следующее:

    Не забываете, что dbName(название базы данных), host(название хоста), usr(имя пользователя), pwd(пароль) - это все данные, необходимые для подключения. Рекомендуется использовать функцию, например, назвать ее "bool createConnection()" и в дальнейшем передавать ей вышеупомянутые параметры, но это не существенно. Что из действительно важных рекомендаций, а так это, в проверке на "db.open()" использовать не "return false" или "return true",а конструкцию:

    Очень важно - в конструкции db.lastError().text() db - это экземпляр QSqlDatabase. Главное преимущество использования db.lastError().text() является то, что так мы узнаем о причине вероятной ошибки, при этом значительно сократим время на то, чтобы узнать о причине ее возникновения. Теперь разберем возможные проблемы.

    Возможно что при сборке драйвера возникла ошибка при сборке драйвера, должно появляться уведомление о невозможности сборки с ссылки на файл с расширением .lib. Если вы внимательно прочитали статью и уверены, что ошибка возникла из-за чего-то "другого", то с вероятностью 80% у Вас разные архитектуры между самим Posgre и скомпилированным приложением Qt. Так уж получилось, что большинство компиляторов Qt 32x разрядные, а в сейчас большинство людей используют 64x разрядные системы. Теперь Вы имеете выбор: скачать заново СУБД, только уже 32x или собрать новый компилятор для Qt. К сожалению первое сделать предельно просто(относительно объяснения), а второе - напротив, для этого стоит прочитать отдельную статью. после выполнения первого или второго драйвер успешно собирается и подключается к Qt.

    Если вы выбрали драйвер QODBC, то придется для начала скачать этот драйвер для Вашей OC с официального сайта. Установка драйвера проходит довольно быстро и теперь можно приступать к подключению. Перейдите в меню пуск -> поиск -> Администрирование -> Источники данных(ODBC). Во вкладке "пользовательский DNS" нажимаем на "Добавить" и там должны увидеть наши драйвера в вариации Unicode и ANSI. Выбор остается за Вами. После того, как вы добавите драйвер, его нужно настроить - переходим на вкладку "Настройки". Откроется замысловатое окно, и начнем его заполнять: Data Sourse - "придумать" Database - "точное имя базы" Server - "зачастую localhost" User Name - "точное имя пользователя" Port - "зачастую 5432" Password - "точный пароль"

    Строки, которые не были названы заполнять не нужно или оставить в изначальном состоянии.Можете нажать на кнопку "Test" для проверки соединения с базой. Далее жмем на "Save". Чтобы осуществить подключение напишем следующее:

    Не забываем, что dbName(это строка Data Source(в Администрировании) - это очень важно, т.к. для драйвера QPSQL в этом месте используется просто имя базы данных), host(название хоста), usr(имя пользователя), pwd(пароль) - это все данные, необходимые для подключения. Рекомендую использовать функцию, например, назвать ее "bool createConnection()" и в дальнейшем передавать ей вышеупомянутые параметры, но это не существенно. Что из действительно важных рекомендаций, а так это, в проверке на "db.open()" использовать не "return false" или "return true",а конструкцию:

    Очень важно - в конструкции db.lastError().text() db - это экземпляр QSqlDatabase. Главное преимущество использования db.lastError().text() является то, что так мы узнаем о причине вероятной ошибки, при этом значительно сократим время на то, чтобы узнать о причине ее возникновения. Теперь разберем возможные проблемы.

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

    1. Как уже отмечалось ранее установить себе 32х разрядный Posgre(в этом случае это относится и к другим СУБД).

    2. Установить 64x разрядный компилятор для Qt.

    Стоит отметить, что в некоторых системах Windows в окне Администрирование не видны 32х разрядные драйвера, что очень печально, но это Вам не помешает его установить. Для этого после установки 32х разрядного драйвера переходим по пути С:\Windows\SysWOW64 и запускаем obdcad32. Вы увидите то же самое окно Администрирования "Источники баз данных ODBC", только там будут находиться все драйвера, включая и 32х. Теперь в этом окне нажимает "Добавить" - находим драйвер и подключаем его.

    Хотел бы поделиться с форумом решением, которое помогло лично мне в решении проблемы указанной в Теме. Может кому тоже поможет.

    Дано: 1. станция разработки на Венде 10. 2. Среда разработки Qt Creator 4.9.1. 3. Программа с таким куском кода:

    Проблема: соединение всегда неуспешно с ошибкой, указанной в Теме.

    Что делал (по советам Инета): 1. помещал в рабочую папку с бинарником своей программы различные dll-ки. 2. в переменной окружения PATH указывал путь C:\Qt\5.12.4\mingw73_64\plugins\sqldrivers. 3. установил Postgres Pro Standard на станцию разработки с офф. сайта разработчика и указал в PATH путь до либов: C:\Program Files\PostgresPro\11\lib

    Что не делал: 1. не использовал в проге драйвер QODBC. 2. не пересобирал libpq.dll из исходников.

    Помогло следующее: 1. в переменной окружения PATH указал путь до бинов Postgres'а: C:\Program Files\PostgresPro\11\bin.

    У меня всё по данному вопросу. Всем спасибо за внимание.


    Спасибо помечу в закладки. А без PATH не работает?


    Помогло следующее: 1. в переменной окружения PATH указал путь до бинов Postgres'а: C:\Program Files\PostgresPro\11\bin.

    В принципе, из этих библиотек можно подобрать такие (помимо libpq, это всякие iconv и ssleay), что полная установка PostgreSQL будет не нужна. Но остаётся необходимость в предварительной установке Microsoft Redistributable, ибо виндовый PostgreSQL собирается вижуал студией (по крайней мере, несколько лет назад собирался).


    В принципе, из этих библиотек можно подобрать такие (помимо libpq, это всякие iconv и ssleay), что полная установка PostgreSQL будет не нужна.


    Работает. Убрал из PATH пути к либам и бинам Postgres Pro и поместил все DLL-ки в раб.каталог программы. Всё соединяется. Сейчас в каталоге находятся следующие DLL-ки:

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