Драйверы баз данных SQL
Модуль Qt SQL использует драйверы плагины для взаимодействия с различными API баз данных. Поскольку API модуля SQL Qt независим от базы данных, весь код, специфичный для базы данных, содержится в этих драйверах. Qt поставляется с несколькими драйверами, и можно добавить другие. Исходный код драйвера предоставляется и может быть использован в качестве модели для создания собственных драйверов.
Поддерживаемые базы данных
В таблице ниже перечислены драйверы, включенные в Qt:
| Имя драйвера | Система управления базами данных (СУБД) |
|---|---|
| QDB2 | IBM DB2 (версия 7.1 и выше) |
| QIBASE | Borland InterBase |
| QMYSQL / MARIADB | MySQL или MariaDB (версия 5.0 и выше) |
| QOCI | Драйвер Oracle Call Interface |
| QODBC | Open Database Connectivity (ODBC) - Microsoft SQL Server и другие базы данных, совместимые с ODBC |
| QPSQL | PostgreSQL (версии 7.3 и выше) |
| QSQLITE2 |
SQLite версия 2 Примечание: устарел начиная с Qt 5.14 |
| QSQLITE | SQLite версия 3 |
| QTDS | Sybase Adaptive Server Примечание: устарел начиная с Qt 4.7 |
SQLite — это инпроцессная система баз данных с лучшим покрытием тестов и поддержкой на всех платформах. Oracle через OCI, PostgreSQL и MySQL через ODBC или родной драйвер хорошо протестированы на Windows и Linux. Полностью поддержка других систем зависит от доступности и качества клиентских библиотек.
Примечание: Для построения плагина драйвера вам потребуется соответствующая клиентская библиотека для вашей системы управления базами данных (СУБД). Это обеспечивает доступ к API, экспонированному СУБД, и обычно поставляется вместе с ней. Большинство установочных программ также позволяют установить «библиотеки разработки», и именно они вам нужны. Эти библиотеки отвечают за низкоуровневое взаимодействие с СУБД. Также убедитесь, что установлены правильные библиотеки базы данных для вашей архитектуры Qt (32 или 64 бита).
Примечание: При использовании Qt в рамках условий открытого исходного кода, но с проприетарной базой данных, проверьте совместимость лицензии клиентской библиотеки с LGPL.
Компиляция драйверов
Qt configure скрипт пытается автоматически обнаружить доступные клиентские библиотеки на вашем компьютере. Запустите configure -help , чтобы увидеть, какие драйверы можно скомпилировать. Вы должны получить вывод, похожий на этот:
[...]
Database options:
-sql-<driver> ........ Enable SQL <driver> plugin. Supported drivers:
db2 ibase mysql oci odbc psql sqlite2 sqlite tds
[all auto]
-sqlite .............. Select used sqlite3 [system/qt]
[...] Скрипт configure не может обнаружить необходимые библиотеки и файлы заголовков, если они не находятся в стандартных путях, поэтому может потребоваться указать эти пути с помощью *_INCDIR=, *_LIBDIR=, или *_PREFIX= командных параметров. Например, если ваши файлы MySQL установлены в /usr/local/mysql (или в C:/Program Files/MySQL/MySQL Connector C 6.1 в Windows), то передайте следующий параметр для конфигурации: MYSQL_PREFIX=/usr/local/mysql (или MYSQL_PREFIX="C:/Program Files/MySQL/MySQL Connector C 6.1" для Windows). Подробности для каждого драйвера описаны ниже.
Примечание: Если что-то пойдёт не так и вы хотите, чтобы qmake повторно проверил доступные драйверы, удалите файл config.cache в <QTDIR>/qtbase/src/plugins/sqldrivers — в противном случае qmake не будет повторно искать доступные драйверы. Если во время этапа qmake возникла ошибка, откройте файл config.log, чтобы увидеть причину ошибки.
Типичный запуск qmake (в данном случае для конфигурации MySQL) выглядит так:
C:\Qt5\5.13.2\Src\qtbase\src\plugins\sqldrivers>qmake -version
QMake version 3.1
Using Qt version 5.13.2 in C:/Qt5/5.13.2/mingw73_64/lib
C:\Qt5\5.13.2\Src\qtbase\src\plugins\sqldrivers>qmake -- MYSQL_INCDIR="C:/Program Files/MySQL/MySQL Connector C 6.1/include" MYSQL_LIBDIR="C:/Program Files/MySQL/MySQL Connector C 6.1/lib"
Info: creating stash file C:\Qt5\5.13.2\Src\qtbase\src\plugins\sqldrivers\.qmake.stash
Running configuration tests...
Checking for DB2 (IBM)... no
Checking for InterBase... no
Checking for MySQL... yes
Checking for OCI (Oracle)... no
Checking for ODBC... yes
Checking for PostgreSQL... no
Checking for SQLite (version 2)... no
Checking for TDS (Sybase)... no
Done running configuration tests.
Configure summary:
Qt Sql Drivers:
DB2 (IBM) .............................. no
InterBase .............................. no
MySql .................................. yes
OCI (Oracle) ........................... no
ODBC ................................... yes
PostgreSQL ............................. no
SQLite2 ................................ no
SQLite ................................. yes
Using system provided SQLite ......... no
TDS (Sybase) ........................... no
Qt is now configured for building. Just run 'mingw32-make'.
Once everything is built, you must run 'mingw32-make install'.
Qt will be installed into 'C:\Qt5\5.13.2\mingw73_64'.
Prior to reconfiguration, make sure you remove any leftovers from the previous build. Из-за практических соображений, связанных с внешними зависимостями, только плагин SQLite3 поставляется с двоичными сборками Qt. Чтобы иметь возможность добавлять дополнительные драйверы в установку Qt без перекомпиляции всего Qt, можно настроить и скомпилировать директорию qtbase/src/plugins/sqldrivers вне каталога полной сборки Qt. Обратите внимание, что нельзя настроить каждый драйвер по отдельности, только все сразу. Однако драйверы можно скомпилировать по отдельности. Если сборка Qt настроена с -prefix, необходимо также установить плагины после их компиляции. Например:
cd $QTDIR/qtbase/src/plugins/sqldrivers/mysql make install
Сведения о драйверах
QMYSQL для MySQL или MariaDB 5 и выше
MariaDB — это вилка MySQL, призванная оставаться свободной и открытой программным обеспечением под лицензией GNU General Public License. MariaDB стремится поддерживать высокую совместимость с MySQL, обеспечивая возможность прямой замены с бинарной совместимостью библиотек и точным соответствием API и командам MySQL. Поэтому плагин для MySQL и MariaDB объединён в один плагин Qt.
Поддержка хранимых процедур QMYSQL
MySQL 5 имеет поддержку хранимых процедур на уровне SQL, но не имеет API для управления параметрами IN, OUT и INOUT. Поэтому параметры необходимо устанавливать и считывать с помощью команд SQL вместо QSqlQuery::bindValue().
Пример хранимой процедуры:
create procedure qtestproc (OUT param1 INT, OUT param2 INT)
BEGIN
set param1 = 42;
set param2 = 43;
END Исходный код для доступа к значениям OUT:
QSqlQuery q;
q.exec("call qtestproc (@outval1, @outval2)");
q.exec("select @outval1, @outval2");
if (q.next())
qDebug() << q.value(0) << q.value(1); // outputs "42" and "43" Примечание: @outval1 и @outval2 — это переменные, локальные для текущего подключения, и они не будут затронуты запросами, отправленными с другого хоста или подключения.
Встроенный сервер MySQL
Встроенный сервер MySQL — это прямая замена обычной клиентской библиотеки. С встроенным сервером MySQL не требуется сервер MySQL для использования функциональности MySQL.
Чтобы использовать встроенный сервер MySQL, просто свяжите плагин Qt с libmysqld вместо libmysqlclient. Это можно сделать, добавив MYSQL_LIBS=-lmysqld в командную строку конфигурации.
Для получения дополнительной информации о встроенном сервере MySQL обратитесь к документации MySQL, глава «libmysqld, библиотека встроенного сервера MySQL».
Как скомпилировать плагин QMYSQL на Unix и macOS
Вам потребуются заголовочные файлы MySQL/MariaDB, а также общая библиотека libmysqlclient.so / libmariadb.so. В зависимости от вашей дистрибуции Linux, вам может потребоваться установить пакет, который обычно называется «mysql-devel» или «mariadb-devel».
Укажите qmake, где найти заголовочные файлы и общие библиотеки MySQL/MariaDB (здесь предполагается, что MySQL/MariaDB установлен в /usr/local) и запустите make:
cd $QTDIR/qtbase/src/plugins/sqldrivers qmake -- MYSQL_PREFIX=/usr/local make sub-mysql
Как скомпилировать плагин QMYSQL на Windows
Вам необходимо получить файлы установки MySQL (например, mysql-installer-web-community-8.0.18.0.msi) или mariadb-connector-c-3.1.5-win64.msi. Запустите установщик, выберите пользовательскую установку и установите MySQL C Connector, соответствующий вашей установке Qt (x86 или x64). После установки проверьте наличие необходимых файлов:
<MySQL dir>/lib/libmysql.lib<MySQL dir>/lib/libmysql.dll<MySQL dir>/include/mysql.h
и для MariaDB
<MariaDB dir>/lib/libmariadb.lib<MariaDB dir>/lib/libmariadb.dll<MariaDB dir>/include/mysql.h
Примечание: Начиная с MySQL 8.0.19, C Connector больше не предлагается как автономный устанавливаемый компонент. Вместо этого вы можете получить mysql.h и libmysql.* установив полный сервер MySQL (только x64) или MariaDB C Connector.
Скомпилируйте плагин следующим образом (здесь предполагается, что <MySQL dir> это C:/Program Files/MySQL/MySQL Connector C 6.1):
cd %QTDIR%\qtbase\src\plugins\sqldrivers qmake -- MYSQL_INCDIR="C:/Program Files/MySQL/MySQL Connector C 6.1/include" MYSQL_LIBDIR="C:/Program Files/MySQL/MySQL Connector C 6.1/lib" nmake sub-mysql nmake install
Если вы не используете компилятор Microsoft, замените nmake на mingw32-make выше.
При распространении вашего приложения не забудьте включить libmysql.dll / libmariadb.dll в ваш установочный пакет. Он должен быть размещён в той же папке, что и исполняемый файл приложения. libmysql.dll дополнительно нуждается в библиотеках времени выполнения MSVC, которые можно установить с помощью vcredist.exe
QOCI для Oracle Call Interface (OCI)
Плагин Qt OCI поддерживает Oracle 9i, 10g и выше. После подключения к серверу Oracle плагин автоматически определит версию базы данных и включит соответствующие функции.
Возможно подключение к базе данных Oracle без файла tnsnames.ora. Для этого необходимо передать SID базы данных в драйвер в качестве имени базы данных и указать имя хоста.
Аутентификация пользователей OCI
Плагин Qt OCI поддерживает аутентификацию с использованием внешних учетных данных (OCI_CRED_EXT). Обычно это означает, что сервер базы данных будет использовать аутентификацию пользователя, предоставленную операционной системой, вместо собственного механизма аутентификации.
Оставьте имя пользователя и пароль пустыми при открытии подключения с помощью QSqlDatabase, чтобы использовать аутентификацию по внешним учетным данным.
Поддержка OCI BLOB/LOB
Бинарные большие объекты (BLOB) могут быть считываемы и записываемы, но имейте в виду, что этот процесс может потребовать много памяти. Вы должны использовать запрос с простым просмотром для выбора полей LOB (см. QSqlQuery::setForwardOnly()).
Вставка BLOB должна выполняться с помощью подготовленного запроса, где BLOB привязаны к именованным параметрам, или QSqlTableModel, который использует подготовленный запрос для этого внутренне.
Как скомпилировать плагин OCI на Unix и macOS
Для Oracle 10g вам потребуется «Пакет Instant Client — Базовый» и «Пакет Instant Client — SDK». Для Oracle, предшествующего 10g, вам потребуются стандартный клиент Oracle и пакеты SDK.
Файлы библиотек Oracle, необходимые для компиляции драйвера:
-
libclntsh.so(все версии) -
libwtc9.so(только Oracle 9)
Укажите qmake местоположение файлов заголовков и общих библиотек Oracle и запустите make:
Для Oracle версии 9:
cd $QTDIR/qtbase/src/plugins/sqldrivers qmake -- OCI_INCDIR="$ORACLE_HOME/rdbms/public" OCI_LIBDIR="$ORACLE_HOME/lib" OCI_LIBS="-lclntsh -lwtc9" make sub-oci
Для Oracle версии 10, предполагается, что вы установили RPM-пакеты SDK пакета Instant Client (необходимо скорректировать номер версии):
cd $QTDIR/qtbase/src/plugins/sqldrivers qmake -- OCI_INCDIR=/usr/include/oracle/10.1.0.3/client OCI_LIBDIR=/usr/lib/oracle/10.1.0.3/client/lib make sub-oci
Примечание: Если вы используете пакет Oracle Instant Client, вам потребуется установить LD_LIBRARY_PATH при компиляции плагина OCI SQL и при запуске приложения, использующего плагин OCI SQL. Вы можете избежать этой необходимости, установив RPATH и перечислив все библиотеки для линковки. Вот пример:
configure OCI_INCDIR=/usr/include/oracle/10.1.0.3/client OCI_LIBDIR=/usr/lib/oracle/10.1.0.3/client/lib -R /usr/lib/oracle/10.1.0.3/client/lib OCI_LIBS="-lclntsh -lnnz10" make
Если вы хотите вручную собрать плагин OCI этим методом, процедура выглядит следующим образом:
cd $QTDIR/qtbase/src/plugins/sqldrivers qmake -- OCI_INCDIR=/usr/include/oracle/10.1.0.3/client OCI_LIBDIR=/usr/lib/oracle/10.1.0.3/client/lib OCI_LIBS="-Wl,-rpath,/usr/lib/oracle/10.1.0.3/client/lib -lclntsh -lnnz10" make sub-oci
Как скомпилировать плагин OCI в Windows
Выбор опции «Программист» в установщике Oracle Client с компакт-диска Oracle Client Installation, как правило, достаточно для сборки плагина. Для некоторых версий Oracle Client вам также может потребоваться выбрать опцию «Интерфейс вызовов (OCI)», если она доступна.
Соберите плагин следующим образом (здесь предполагается, что Oracle Client установлен в C:\oracle):
cd %QTDIR%\qtbase\src\plugins\sqldrivers qmake -- OCI_INCDIR=c:/oracle/oci/include OCI_LIBDIR=c:/oracle/oci/lib/msvc nmake sub-oci
Если вы не используете компилятор Microsoft, замените nmake на mingw32-make в строке выше.
При запуске приложения вам также потребуется добавить oci.dll путь в вашу переменную среды PATH.
set PATH=%PATH%;c:\oracle\bin
QODBC для открытой базы данных (ODBC)
ODBC — это общий интерфейс, который позволяет подключаться к нескольким СУБД с помощью одного интерфейса. Драйвер QODBC позволяет подключаться к диспетчеру драйверов ODBC и получать доступ к доступным источникам данных. Обратите внимание, что вам также необходимо установить и настроить драйверы ODBC для диспетчера драйверов ODBC, установленного в вашей системе. Плагин QODBC затем позволяет использовать эти источники данных в ваших приложениях Qt.
Примечание: Следует использовать родной драйвер, если он доступен, вместо драйвера ODBC. Поддержка ODBC может использоваться как резервный вариант для совместимых баз данных, если родной драйвер недоступен.
В Windows диспетчер драйверов ODBC должен устанавливаться по умолчанию. Для систем Unix существуют некоторые реализации, которые необходимо установить предварительно. Обратите внимание, что каждый конечный пользователь вашего приложения должен иметь установленный диспетчер драйверов ODBC, иначе плагин QODBC не будет работать.
При подключении к источнику данных ODBC вы должны передать имя источника данных ODBC в функцию QSqlDatabase::setDatabaseName(), а не фактическое имя базы данных.
Плагину QODBC нужен диспетчер драйверов ODBC версии 2.0 или выше. Некоторые драйверы ODBC заявляют о соответствии версии 2.0, но не предлагают всю необходимую функциональность. Поэтому плагин QODBC проверяет, можно ли использовать источник данных после установления соединения, и отказывается работать, если проверка завершается неудачно. Если вам не нравится это поведение, вы можете удалить строку #define ODBC_CHECK_DRIVER из файла qsql_odbc.cpp. Делайте это на свой страх и риск!
По умолчанию Qt указывает драйверу ODBC работать как драйвер ODBC 2.x. Однако для некоторых сочетаний диспетчер-драйвер/драйвер ODBC 3.x (например, unixODBC/MaxDB ODBC), указание драйверу ODBC работать как драйвер 2.x может привести к неожиданному поведению плагина драйвера. Чтобы избежать этой проблемы, укажите драйверу ODBC работать как драйвер 3.x, установив параметр подключения "SQL_ATTR_ODBC_VERSION=SQL_OV_ODBC3" перед открытием подключения к базе данных. Обратите внимание, что это повлияет на множество аспектов поведения драйвера ODBC, например, SQLSTATE. Перед установкой этого параметра подключения проконсультируйтесь с документацией ODBC о различиях в поведении, которые вы можете ожидать.
При использовании базы данных SAP HANA подключение должно устанавливаться с параметром «SCROLLABLERESULT=TRUE», так как драйвер HANA ODBC по умолчанию не предоставляет прокручиваемые результаты, например:
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC3");
QString connectString = QStringLiteral(
"DRIVER=/path/to/installation/libodbcHDB.so;"
"SERVERNODE=hostname:port;"
"UID=USER;"
"PWD=PASSWORD;"
"SCROLLABLERESULT=true");
db.setDatabaseName(connectString); Если вы сталкиваетесь с очень медленным доступом к источнику данных ODBC, убедитесь, что отслеживание вызовов ODBC отключено в диспетчере источников данных ODBC.
Некоторые драйверы не поддерживают прокручиваемые курсоры. В этом случае успешно можно использовать только запросы в режиме forwardOnly.
Поддержка хранимых процедур ODBC
В Microsoft SQL Server набор результатов, возвращаемый хранимой процедурой, использующей оператор return или возвращающей несколько наборов результатов, будет доступен только в том случае, если вы установите режим запроса forward only в значение forward, используя QSqlQuery::setForwardOnly().
// STORED_PROC uses the return statement or returns multiple result sets
QSqlQuery query;
query.setForwardOnly(true);
query.exec("{call STORED_PROC}"); Примечание: Значение, возвращаемое оператором return хранимой процедуры, игнорируется.
Поддержка Unicode ODBC
Плагин QODBC будет использовать API Unicode, если определён UNICODE. В системах Windows NT это значение по умолчанию. Обратите внимание, что драйвер ODBC и СУБД также должны поддерживать Unicode.
Для драйвера Oracle 9 ODBC (Windows) необходимо проверить «Поддержка SQL_WCHAR» в диспетчере драйверов ODBC, в противном случае Oracle преобразует все строковые значения Unicode в локальные 8-битные.
Как скомпилировать плагин ODBC в Unix и macOS
Рекомендуется использовать unixODBC. Вы можете найти последнюю версию и драйверы ODBC по адресу http://www.unixodbc.org. Вам понадобятся заголовочные файлы и общие библиотеки unixODBC.
Укажите qmake местоположение заголовочных файлов и общих библиотек unixODBC (здесь предполагается, что unixODBC установлен в /usr/local/unixODBC ) и запустите make:
cd $QTDIR/qtbase/src/plugins/sqldrivers qmake -- ODBC_PREFIX=/usr/local/unixODBC make sub-odbc
Как скомпилировать плагин ODBC в Windows
Заголовочные и включаемые файлы ODBC должны быть уже установлены в соответствующих каталогах. Вам просто нужно скомпилировать плагин следующим образом:
cd %QTDIR%\qtbase\src\plugins\sqldrivers qmake nmake sub-odbc
Если вы не используете компилятор Microsoft, замените nmake на mingw32-make в строке выше.
QPSQL для PostgreSQL (Версия 7.3 и выше)
Драйвер QPSQL поддерживает версию 7.3 и выше сервера PostgreSQL.
Для получения дополнительной информации о PostgreSQL посетите http://www.postgresql.org.
Поддержка Unicode QPSQL
Драйвер QPSQL автоматически определяет, поддерживает ли база данных PostgreSQL, к которой вы подключаетесь, Unicode или нет. Unicode используется автоматически, если сервер его поддерживает. Обратите внимание, что драйвер поддерживает только кодировку UTF-8. Если ваша база данных использует другую кодировку, сервер должен быть скомпилирован с поддержкой преобразования Unicode.
Поддержка Unicode была введена в PostgreSQL версии 7.1, и она будет работать только в том случае, если сервер и библиотека клиента были скомпилированы с поддержкой многобайтовых символов. Более подробную информацию о том, как настроить сервер PostgreSQL с поддержкой многобайтовых символов, можно найти в руководстве администратора PostgreSQL, глава 5.
QPSQL чувствительность к регистру
Базы данных PostgreSQL будут учитывать регистр только в том случае, если имя таблицы или поля заключено в кавычки при создании таблицы. Например, запрос SQL:
CREATE TABLE "testTable" ("id" INTEGER); обеспечит доступ с тем же регистром, который использовался. Если имя таблицы или поля не заключено в кавычки при создании, фактическое имя таблицы или поля будет в нижнем регистре. Когда QSqlDatabase::record() или QSqlDatabase::primaryIndex() обращаются к таблице или полю, которые не были заключены в кавычки при создании, имя, передаваемое в функцию, должно быть в нижнем регистре, чтобы гарантировать, что оно найдено. Например:
QString tableString("testTable");
QSqlQuery q;
// Create table query is not quoted, therefore it is mapped to lower case
q.exec(QString("CREATE TABLE %1 (id INTEGER)").arg(tableString));
// Call toLower() on the string so that it can be matched
QSqlRecord rec = database.record(tableString.toLower()); Поддержка QPSQL запросов forward-only
Для использования запросов forward-only необходимо скомпилировать плагин QPSQL с библиотекой клиента PostreSQL версии 9.2 или выше. Если плагин скомпилирован со старой версией, режим forward-only не будет доступен — вызов QSqlQuery::setForwardOnly() со значением true не повлияет.
Предупреждение: Если вы скомпилируете плагин QPSQL с PostgreSQL версии 9.2 или выше, то вы должны распространять ваше приложение с libpq версии 9.2 или выше. В противном случае загрузка плагина QPSQL завершится неудачей с сообщением:
QSqlDatabase: QPSQL driver not loaded QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QMARIADB QODBC QODBC3 QPSQL QPSQL7 Could not create database object
При навигации по результатам в режиме forward-only дескриптор QSqlResult может измениться. Приложения, использующие низкоуровневый дескриптор SQL-результата, должны получить новый дескриптор после каждого вызова любой из функций извлечения QSqlResult. Пример:
QSqlQuery query;
QVariant v;
query.setForwardOnly(true);
query.exec("SELECT * FROM table");
while (query.next()) {
// Handle changes in every iteration of the loop
v = query.result()->handle();
if (qstrcmp(v.typeName(), "PGresult*") == 0) {
PGresult *handle = *static_cast<PGresult **>(v.data());
if (handle) {
// Do something...
}
}
} При чтении результатов запроса forward-only с PostgreSQL подключение к базе данных не может использоваться для выполнения других запросов. Это ограничение библиотеки libpq. Пример:
int value;
QSqlQuery query1;
query1.setForwardOnly(true);
query1.exec("select * FROM table1");
while (query1.next()) {
value = query1.value(0).toInt();
if (value == 1) {
QSqlQuery query2;
query2.exec("update table2 set col=2"); // WRONG: This will discard all results of
} // query1, and cause the loop to quit
} Эта проблема не возникнет, если запросы query1 и query2 используют разные подключения к базе данных или если мы выполняем запрос query2 после цикла while.
Примечание: Некоторые методы QSqlDatabase, такие как tables(), primaryIndex(), неявно выполняют SQL-запросы, поэтому их также нельзя использовать во время навигации по результатам запроса forward-only.
Примечание: QPSQL выведет следующее предупреждение, если обнаружит потерю результатов запроса:
QPSQLDriver::getResult: Query results lost - probably discarded on executing another SQL query.
Как скомпилировать плагин QPSQL в Unix и macOS
Вам нужна библиотека клиента PostgreSQL и заголовочные файлы.
Для того чтобы qmake нашёл заголовочные файлы и общие библиотеки PostgreSQL, выполните qmake следующим образом (предполагая, что клиент PostgreSQL установлен в /usr):
cd $QTDIR/qtbase/src/plugins/sqldrivers qmake -- PSQL_INCDIR=/usr/include/pgsql make sub-psql
Как скомпилировать плагин QPSQL в Windows
Установите соответствующие библиотеки разработчика PostgreSQL для вашего компилятора. Предполагая, что PostgreSQL установлен в C:\psql, скомпилируйте плагин следующим образом:
cd %QTDIR%\qtbase\src\plugins\sqldrivers qmake -- PSQL_INCDIR=C:/psql/include PSQL_LIBDIR=C:/psql/lib/ms nmake sub-psql nmake install
Пользователи MinGW могут обратиться к следующему онлайн-документу: PostgreSQL MinGW/Native Windows.
При распространении приложения не забудьте включить libpq.dll в пакет установки. Он должен быть размещён в той же папке, что и исполняемый файл приложения.
QTDS для Sybase Adaptive Server
Примечание: TDS больше не используется MS Sql Server и устарел, заменён на ODBC. QTDS устарел с Qt 4.7.
Невозможно установить порт с помощью QSqlDatabase::setPort() из-за ограничений в библиотеке клиента Sybase. Обратитесь к документации Sybase для получения информации о том, как настроить конфигурационный файл клиента Sybase для подключения к базам данных на нестандартных портах.
Как скомпилировать плагин QTDS в Unix и macOS
В Unix доступны две библиотеки, которые поддерживают протокол TDS:
- FreeTDS, бесплатная реализация протокола TDS (http://www.freetds.org).
- Sybase Open Client, доступный по адресу https://support.sap.com.
Независимо от того, какую библиотеку вы используете, необходим общий объект libsybdb.so . Установите переменную среды SYBASE для указания каталога, где вы установили библиотеку клиента, и выполните qmake:
cd $QTDIR/qtbase/src/plugins/sqldrivers qmake -- TDS_PREFIX=$SYBASE make sub-tds
Как скомпилировать плагин QDTS в Windows
Вы можете использовать либо библиотеку DB-Library, предоставляемую Microsoft, либо Sybase Open Client (https://support.sap.com). Configure попытается найти NTWDBLIB.LIB для компиляции плагина:
cd %QTDIR%\qtbase\src\plugins\sqldrivers qmake nmake sub-tds nmake install
По умолчанию, на Windows используется библиотека Microsoft. Если вы хотите принудительно использовать Sybase Open Client, необходимо определить Q_USE_SYBASE в %QTDIR%\qtbase\src\plugins\sqldrivers\tds\qsql_tds.cpp.
Если вы не используете компилятор Microsoft, замените nmake на mingw32-make в строке выше.
QDB2 для IBM DB2 (Версия 7.1 и выше)
Плагин Qt DB2 позволяет получить доступ к базам данных IBM DB2. Он был протестирован с IBM DB2 v7.1 и 7.2. Вам необходимо установить клиентскую библиотеку разработки IBM DB2, которая содержит заголовочные и библиотечные файлы, необходимые для компиляции плагина QDB2.
Драйвер QDB2 поддерживает подготовленные запросы, чтение/запись строк Юникода и чтение/запись BLOB.
Рекомендуется использовать запросы с однократным проходом при вызове хранимых процедур в DB2 (см. QSqlQuery::setForwardOnly()).
Как скомпилировать плагин QDB2 на Unix и macOS
cd $QTDIR/qtbase/src/plugins/sqldrivers qmake -- DB2_PREFIX=$DB2DIR make sub-db2
Как скомпилировать плагин QDB2 на Windows
Заголовочные и включаемые файлы DB2 должны быть уже установлены в нужных каталогах. Вам нужно просто скомпилировать плагин следующим образом:
cd %QTDIR%\qtbase\src\plugins\sqldrivers qmake -- DB2_PREFIX="<DB2 home>/sqllib" nmake sub-db2 nmake install
Если вы не используете компилятор Microsoft, замените nmake на mingw32-make в строке выше.
QSQLITE2 для SQLite Версия 2
Плагин Qt SQLite 2 предлагается для совместимости. Всякий раз, когда это возможно, используйте плагин версии 3 вместо него. Инструкции по сборке для версии 3 также применимы к версии 2.
QSQLITE для SQLite (Версия 3 и выше)
Плагин Qt SQLite позволяет получать доступ к базам данных SQLite. SQLite — это база данных в процессе, что означает, что сервер базы данных не нужен. SQLite работает с одним файлом, который должен быть указан как имя базы данных при открытии соединения. Если файл не существует, SQLite попытается создать его. SQLite также поддерживает базы данных в памяти и временные базы данных. Просто передайте ":memory:" или пустую строку в качестве имени базы данных соответственно.
SQLite имеет некоторые ограничения относительно нескольких пользователей и нескольких транзакций. Если вы пытаетесь читать/записывать ресурс из разных транзакций, ваше приложение может зависнуть до тех пор, пока одна транзакция не будет подтверждена или отменена. Драйвер Qt SQLite будет повторно пытаться записать в заблокированный ресурс до истечения времени ожидания (см. QSQLITE_BUSY_TIMEOUT в QSqlDatabase::setConnectOptions()).
В SQLite любой столбец, за исключением столбца INTEGER PRIMARY KEY, может хранить любой тип значения. Например, столбец, объявленный как INTEGER, может содержать целое число в одной строке и текстовое значение в следующей. Это связано с тем, что SQLite связывает тип значения со значением, а не со столбцом, в котором оно хранится. Следствием этого является то, что тип, возвращаемый QSqlField::type(), указывает только рекомендуемый тип поля. Не следует делать предположений о фактическом типе на основе этого, и необходимо проверять тип отдельных значений.
Драйвер заблокирован для обновлений во время выполнения запроса select. Это может вызвать проблемы при использовании QSqlTableModel, так как виджеты элементов Qt извлекают данные по мере необходимости (с помощью QSqlQuery::fetchMore() в случае QSqlTableModel).
Вы можете найти информацию о SQLite на http://www.sqlite.org.
Как скомпилировать плагин QSQLITE
SQLite версии 3 включен в Qt как библиотека сторонних производителей. Его можно скомпилировать, передав параметр -qt-sqlite скрипту конфигурации.
Если вы не хотите использовать библиотеку SQLite, включенную в Qt, вы можете передать -system-sqlite скрипту конфигурации, чтобы использовать библиотеки SQLite операционной системы. Это рекомендуется всякий раз, когда это возможно, так как это уменьшает размер установки и удаляет один компонент, за которым необходимо следить в отношении рекомендаций по безопасности.
В Unix и macOS (замените $SQLITE на каталог, где находится SQLite):
cd $QTDIR/qtbase/src/plugins/sqldrivers qmake -- -system-sqlite SQLITE3_PREFIX=$SQLITE make sub-sqlite
В Windows:
cd %QTDIR%\qtbase\src\plugins\sqldrivers qmake -- -system-sqlite SQLITE3_PREFIX=C:/SQLITE nmake sub-sqlite nmake install
Включить оператор REGEXP
SQLite поставляется с операцией REGEXP. Однако необходимую реализацию должен предоставить пользователь. Для удобства, можно включить реализацию по умолчанию, установив параметр подключения QSQLITE_ENABLE_REGEXP перед открытием соединения с базой данных. Тогда SQL-запрос, такой как "столбец REGEXP 'шаблон'", по сути, расширяется до Qt-кода
column.contains(QRegularExpression("pattern")); Для повышения производительности регулярные выражения кэшируются внутри. По умолчанию размер кэша составляет 25, но его можно изменить с помощью значения параметра. Например, передача "QSQLITE_ENABLE_REGEXP=10" уменьшает размер кэша до 10.
Совместимость форматов файлов QSQLITE
SQLite в некоторых небольших релизах иногда нарушает обратную совместимость форматов файлов. Например, SQLite 3.3 может читать файлы баз данных, созданные с помощью SQLite 3.2, но базы данных, созданные с помощью SQLite 3.3, не могут быть прочитаны SQLite 3.2. Обратитесь к документации и журналам изменений SQLite за информацией о совместимости формата файла между версиями.
Небольшие релизы Qt обычно следуют за небольшими релизами SQLite, в то время как исправления Qt следуют за исправлениями SQLite. Исправления, таким образом, совместимы как вперед, так и назад.
Для принудительного использования SQLite определенного формата файла, необходимо скомпилировать и отправить свой собственный плагин базы данных с собственной библиотекой SQLite, как показано выше. Некоторые версии SQLite можно принудительно заставить писать определенный формат файла, установив определение SQLITE_DEFAULT_FILE_FORMAT при компиляции SQLite.
QIBASE для Borland InterBase
Плагин Qt InterBase позволяет получить доступ к базам данных InterBase и Firebird. InterBase может использоваться как клиент-сервер или без сервера, в этом случае он работает с локальными файлами. Файл базы данных должен существовать, прежде чем можно будет установить соединение. Firebird должен использоваться с конфигурацией сервера.
Обратите внимание, что InterBase требует указать полный путь к файлу базы данных, независимо от того, хранится ли он локально или на другом сервере.
QSqlDatabase db;
db.setHostName("MyServer");
db.setDatabaseName("C:\\test.gdb"); Для компиляции этого плагина вам потребуются заголовочные файлы и библиотеки InterBase/Firebird.
Из-за несовместимости лицензий с GPL пользователям Qt Open Source Edition не разрешено связывать этот плагин с коммерческими версиями InterBase. Пожалуйста, используйте Firebird или бесплатную версию InterBase.
Поддержка Юникода и кодировка текста QIBASE
По умолчанию драйвер подключается к базе данных с помощью UNICODE_FSS. Это можно переопределить, установив параметр ISC_DPB_LC_CTYPE с помощью QSqlDatabase::setConnectOptions() перед открытием соединения.
// connect to database using the Latin-1 character set
db.setConnectOptions("ISC_DPB_LC_CTYPE=Latin1");
if (db.open())
qDebug("The database connection is open."); Если Qt не поддерживает заданную кодировку текста, драйвер выведет сообщение об ошибке и подключится к базе данных с помощью UNICODE_FSS.
Обратите внимание, что если кодировка текста, установленная при подключении к базе данных, отличается от кодировки в базе данных, могут возникнуть проблемы с транслитерацией.
Хранимые процедуры QIBASE
InterBase/Firebird возвращают значения OUT как наборы результатов, поэтому при вызове хранимых процедур необходимо связать только значения IN через QSqlQuery::bindValue(). Значения RETURN/OUT можно получить через QSqlQuery::value(). Пример:
QSqlQuery q;
q.exec("execute procedure my_procedure");
if (q.next())
qDebug() << q.value(0); // outputs the first RETURN/OUT value Как скомпилировать плагин QIBASE на Unix и macOS
Предполагается, что InterBase или Firebird установлены в /opt/interbase.
Если вы используете InterBase:
cd $QTDIR/qtbase/src/plugins/sqldrivers qmake -- IBASE_PREFIX=/opt/interbase make sub-ibase
Если вы используете Firebird, библиотеку Firebird необходимо установить явно:
cd $QTDIR/qtbase/src/plugins/sqldrivers qmake -- IBASE_PREFIX=/opt/interbase IBASE_LIBS=-lfbclient make sub-ibase
Как скомпилировать плагин QIBASE на Windows
Предполагается, что InterBase или Firebird установлены в C:\interbase.
Если вы используете InterBase:
cd %QTDIR%\qtbase\src\plugins\sqldrivers qmake -- IBASE_INCDIR=C:/interbase/include nmake sub-ibase nmake install
Если вы используете Firebird, библиотеку Firebird необходимо установить явно:
cd %QTDIR%\qtbase\src\plugins\sqldrivers qmake -- IBASE_INCDIR=C:/interbase/include IBASE_LIBS=-lfbclient nmake sub-ibase nmake install
Если вы не используете компилятор Microsoft, замените nmake на mingw32-make в строке выше.
Обратите внимание, что C:\interbase\bin должен находиться в PATH.
Поиск и устранение неполадок
Всегда следует использовать клиентские библиотеки, скомпилированные с тем же компилятором, что и ваш проект. Если вы не можете получить исходное распределение для самостоятельной компиляции клиентских библиотек, вы должны убедиться, что предварительно скомпилированная библиотека совместима с вашим компилятором, в противном случае у вас будет много ошибок "неопределенные символы". Некоторые компиляторы имеют инструменты для преобразования библиотек, например, Borland поставляет инструмент COFF2OMF.EXE для преобразования библиотек, сгенерированных с помощью Microsoft Visual C++.
Если компиляция плагина завершается успешно, но он не может быть загружен, убедитесь, что выполнены следующие требования:
- Убедитесь, что плагин находится в правильном каталоге. Вы можете использовать QApplication::libraryPaths() для определения того, где Qt ищет плагины.
- Убедитесь, что клиентские библиотеки СУБД доступны в системе. В Unix выполните команду
lddи передайте имя плагина в качестве параметра, напримерldd libqsqlmysql.so. Вы получите предупреждение, если какие-либо клиентские библиотеки не будут найдены. В Windows вы можете использовать утилиту Visual Studio's dependency walker. С помощью Qt Creator вы можете обновить переменную средыPATHв разделе Запуск панели Проект, чтобы включить путь к папке, содержащей клиентские библиотеки. - Компилируйте Qt с
QT_DEBUG_COMPONENTопределённым, чтобы получить очень подробный вывод отладки при загрузке плагинов.
Убедитесь, что вы следуете руководству по Развёртыванию плагинов.
Как написать свой драйвер базы данных
QSqlDatabase отвечает за загрузку и управление плагинами драйверов баз данных. Когда база данных добавляется (см. QSqlDatabase::addDatabase()), соответствующий плагин драйвера загружается (с использованием QSqlDriverPlugin). QSqlDatabase полагается на плагин драйвера для предоставления интерфейсов для QSqlDriver и QSqlResult.
QSqlDriver — абстрактный базовый класс, который определяет функциональность драйвера SQL базы данных. Это включает в себя такие функции, как QSqlDriver::open() и QSqlDriver::close(). QSqlDriver отвечает за подключение к базе данных, создание соответствующей среды и т. д. Кроме того, QSqlDriver может создавать объекты QSqlQuery, подходящие для конкретного API базы данных. QSqlDatabase перенаправляет многие свои вызовы функций непосредственно в QSqlDriver, который предоставляет конкретное реализацию.
QSqlResult — абстрактный базовый класс, который определяет функциональность запроса к SQL базе данных. Это включает в себя такие операторы, как SELECT, UPDATE, и ALTER TABLE. QSqlResult содержит функции, такие как QSqlResult::next() и QSqlResult::value(). QSqlResult отвечает за отправку запросов в базу данных, возврат данных результатов и т. д. QSqlQuery перенаправляет многие свои вызовы функций непосредственно в QSqlResult, который предоставляет конкретное реализацию.
QSqlDriver и QSqlResult тесно связаны. При реализации драйвера Qt SQL оба этих класса должны быть унаследованы, и абстрактные виртуальные методы в каждом классе должны быть реализованы.
Для реализации драйвера Qt SQL в виде плагина (чтобы он был распознан и загружен библиотекой Qt во время выполнения), драйвер должен использовать макрос Q_PLUGIN_METADATA(). Прочитайте Как создать плагины Qt для получения дополнительной информации об этом. Вы также можете посмотреть, как это делается в плагинах SQL, поставляемых с Qt, в QTDIR/qtbase/src/plugins/sqldrivers.
Следующий код может быть использован в качестве структуры для драйвера SQL:
class XyzResult : public QSqlResult
{
public:
XyzResult(const QSqlDriver *driver)
: QSqlResult(driver) {}
~XyzResult() {}
protected:
QVariant data(int /* index */) override { return QVariant(); }
bool isNull(int /* index */) override { return false; }
bool reset(const QString & /* query */) override { return false; }
bool fetch(int /* index */) override { return false; }
bool fetchFirst() override { return false; }
bool fetchLast() override { return false; }
int size() override { return 0; }
int numRowsAffected() override { return 0; }
QSqlRecord record() const override { return QSqlRecord(); }
};
class XyzDriver : public QSqlDriver
{
public:
XyzDriver() {}
~XyzDriver() {}
bool hasFeature(DriverFeature /* feature */) const override { return false; }
bool open(const QString & /* db */, const QString & /* user */,
const QString & /* password */, const QString & /* host */,
int /* port */, const QString & /* options */) override
{ return false; }
void close() override {}
QSqlResult *createResult() const override { return new XyzResult(this); }
};
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/sql-driver.html