이 페이지에서

SQL 데이터베이스 드라이버

Qt SQL 모듈은 드라이버 플러그인을 사용하여 다양한 데이터베이스 API와 통신합니다. Qt의 SQL 모듈 API는 데이터베이스에 독립적이므로, 모든 데이터베이스 특정 코드는 이러한 드라이버 내에 포함되어 있습니다. Qt에는 여러 드라이버가 기본으로 제공되며, 다른 드라이버를 추가할 수도 있습니다. 드라이버 소스 코드가 제공되므로, 이를 모델로 삼아 자체 드라이버를 작성할 수 있습니다.

지원되는 데이터베이스

아래 표에는 Qt에 포함된 드라이버들이 나열되어 있습니다:

드라이버 이름DBMS
QDB2IBM DB2 (버전 7.1 이상)
QIBASEBorland InterBase / Firebird
QMYSQL / MARIADBMySQL 또는 MariaDB (버전 5.6 이상)
QOCIOracle Call Interface 드라이버(버전 12.1 이상)
QODBCODBC(Open Database Connectivity) - Microsoft SQL Server 및 기타 ODBC 호환 데이터베이스
QPSQLPostgreSQL(버전 7.3 이상)
QSQLITESQLite 버전 3
QMIMERMimer SQL (버전 11 이상)

SQLite는 모든 플랫폼에서 가장 광범위한 테스트를 거쳤으며 지원 범위가 가장 넓은 인프로세스 데이터베이스 시스템입니다. OCI를 통한 Oracle, PostgreSQL, 그리고 ODBC 또는 네이티브 드라이버를 통한 MySQL은 Windows 및 Linux에서 충분히 테스트되었습니다. 다른 시스템에 대한 지원의 완비 여부는 클라이언트 라이브러리의 가용성과 품질에 따라 달라집니다.

참고: 드라이버 플러그인을빌드하려면 사용 중인 데이터베이스 관리 시스템(DBMS)에 적합한 클라이언트 라이브러리가 필요합니다. 이 라이브러리는 DBMS가 제공하는 API에 대한 액세스를 제공하며, 일반적으로 DBMS와 함께 제공됩니다. 대부분의 설치 프로그램에서는 “개발 라이브러리”를 설치할 수 있도록 허용하며, 바로 이것이 필요한 라이브러리입니다. 이 라이브러리는 DBMS와의 저수준 통신을 담당합니다. 또한 사용 중인 Qt 아키텍처(32비트 또는 64비트)에 맞는 올바른 데이터베이스 라이브러리를 설치했는지 확인하십시오.

참고: 오픈 소스 조건 하에서 Qt를 사용하되 독점 데이터베이스를 사용하는경우 , 클라이언트 라이브러리의 라이선스가 LGPL과 호환되는지 확인하십시오.

드라이버 빌드

특정 드라이버와 함께 Qt 컴파일하기

Qt XML의 ` configure ` 스크립트는 사용자의 시스템에서 사용 가능한 클라이언트 라이브러리를 자동으로 감지하려고 시도합니다. ` configure -help `을 실행하여 빌드할 수 있는 드라이버를 확인하십시오. 다음과 유사한 출력이 표시될 것입니다:

[...]

Database options:

  -sql-<driver> ........ Enable SQL <driver> plugin. Supported drivers:
                         db2 ibase mysql oci odbc psql sqlite
                         [all auto]
  -sqlite .............. Select used sqlite [system/qt]

[...]

configure 스크립트는 필요한 라이브러리와 포함 파일이 표준 경로에 없는 경우 이를 감지할 수 없으므로, 드라이버별 포함 및 라이브러리 경로 변수를 사용하거나 CMAKE_INCLUDE_PATH 및 CMAKE_LIBRARY_PATH 을 통해 해당 경로를 명시적으로 지정해야 할 수 있습니다. 예를 들어, Windows에서 MySQL 파일이 C:\mysql-connector-c-6.1.11-winx64 에 설치된 경우, configure 명령어의 더블 대시(--) 부분에 다음 매개변수를 전달하십시오:

C:\Qt\6.0.0\Src\configure.bat -sql-mysql -- -DMySQL_ROOT="C:\mysql-8.0.22-winx64"
Configure summary:

...
Qt Sql Drivers:
  DB2 (IBM) .............................. no
  InterBase .............................. no
  Mimer SQL .............................. yes
  MySql .................................. yes
  OCI (Oracle) ........................... no
  ODBC ................................... yes
  PostgreSQL ............................. no
  SQLite ................................. yes
    Using system provided SQLite ......... no
...

위와 같은 방식으로 드라이버를 구성하면, CMake는 의존성 검사를 건너뛰고 제공된 경로를 그대로 사용합니다. 이는 패키지가 빌드 루틴에서 인식되어서는 안 되는 자체 시스템 라이브러리 세트를 제공하는 경우에 특히 유용합니다.

각 드라이버에 대한 자세한 내용은 아래에서 설명합니다.

참고: 문제가발생하여 CMake가 사용 가능한 드라이버를 다시 확인하도록 하려면, 빌드 디렉터리에서 CMakeCache.txt 파일을 삭제해야 할 수도 있습니다.

특정 SQL 드라이버만 컴파일하기

Qt가 이미 빌드되었거나 바이너리 버전으로 설치된 상태라면 특정 SQL 드라이버만 컴파일할 수 있습니다. 하지만 반드시 정확히 동일한 버전의 Qt 소스(예: Qt Maintenance Tool)를 설치해야 합니다. 그렇지 않으면 API 변경으로 인해 컴파일 오류가 발생할 수 있습니다. 또한 Windows 시작 메뉴에서 적절한 Qt 명령 프롬프트를 실행하여 빌드 환경을 올바르게 설정했는지 확인하십시오.

일반적인 qt-cmake 실행 예시(이 경우 MySQL용 구성)는 다음과 같습니다:

C:\Qt\6.0.0\mingw81_64\bin\qt-cmake -G Ninja C:\Qt\6.0.0\Src\qtbase\src\plugins\sqldrivers -DMySQL_INCLUDE_DIR="C:\mysql-8.0.22-winx64\include" -DMySQL_LIBRARY="C:\mysql-8.0.22-winx64\lib\libmysql.lib" -DCMAKE_INSTALL_PREFIX="C:\Qt\6.0.0\mingw81_64"
Configure summary:

Qt Sql Drivers:
  DB2 (IBM) .............................. no
  InterBase .............................. no
  Mimer SQL .............................. yes
  MySql .................................. yes
  OCI (Oracle) ........................... no
  ODBC ................................... yes
  PostgreSQL ............................. no
  SQLite ................................. yes
    Using system provided SQLite ......... no

-- Configuring done
-- Generating done
-- Build files have been written to: C:/build-qt6-sqldrivers

qt-cmake 로 구성을 마친 후, ` ninja`을 실행하여 드라이버를 빌드하십시오.

참고: ‘특정 드라이버를 사용하여 Qt 컴파일하기’에서 언급한바와 같이 , 드라이버를 찾을 수 없거나 드라이버가 활성화되어 있지 않은 경우, CMakeCache.txt 파일을 삭제하고 처음부터 다시 시작하십시오.

외부 종속성을 다루는 데 따르는 실무상의 이유로, Qt 바이너리 빌드에는 SQLite 플러그인만 포함되어 제공됩니다. Windows용 Qt 바이너리 빌드에는 ODBC 및 PostgreSQL 플러그인도 포함되어 있습니다. Qt 전체를 다시 빌드하지 않고도 Qt 설치에 드라이버를 추가하려면, 전체 Qt 빌드 디렉터리 외부에서 ` qtbase/src/plugins/sqldrivers ` 디렉터리를 구성하고 빌드할 수 있습니다. 각 드라이버를 개별적으로 구성할 수는 없으며, 모든 드라이버를 한 번에 구성해야 한다는 점에 유의하십시오. 단, 드라이버는 개별적으로 빌드할 수 있습니다.

참고: 빌드가 완료된 후 플러그인을 설치하려면 ` CMAKE_INSTALL_PREFIX`를 지정해야합니다 .

드라이버 관련 세부 사항

MySQL 또는 MariaDB 5.6 이상용 QMYSQL

MariaDB는 GNU 일반 공중 사용 허가서(GNU General Public License)에 따라 무료 및 오픈 소스 소프트웨어로 유지되도록 설계된 MySQL의 포크입니다. MariaDB는 MySQL과의 높은 호환성을 유지하여, 라이브러리 바이너리 패리티를 보장하고 MySQL API 및 명령어와 정확히 일치함으로써 드롭인(drop-in) 대체 기능을 제공하도록 설계되었습니다. 따라서 MySQL 및 MariaDB용 플러그인은 하나의 Qt 플러그인으로 통합되었습니다.

타임스탬프 지원

Qt 6.8부터 ` QDateTime ` 값은 삽입 시 UTC로 변환되고, 검색 시에는 UTC에서 원래 값으로 다시 변환됩니다. 이를 위해 드라이버는 open() 호출 시 연결 시간대를 UTC로 설정합니다(SET time_zone = '+00:00'). MySQL은 시간대 정보를 저장하지 않으므로 이 정보는 손실되며, 검색된 모든 QDateTime 값은 UTC로 표시됩니다.

QMYSQL 저장 프로시저 지원

MySQL은 SQL 수준에서 저장 프로시저를 지원하지만, IN, OUT 및 INOUT 매개변수를 제어할 수 있는 API는 제공하지 않습니다. 따라서 매개변수는 ` QSqlQuery::bindValue()` 대신 SQL 명령어를 사용하여 설정하고 읽어야 합니다.

저장 프로시저 예시:

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 플러그인을 libmysqlclient 대신 libmysqld 에 링크하기만 하면 됩니다. 이는 configure 명령줄에 -DMySQL_LIBRARY=<path/to/mysqld/>libmysqld.<so|lib|dylib> 를 추가하여 수행할 수 있습니다.

MySQL 임베디드 서버에 대한 자세한 내용은 MySQL 문서의 “libmysqld, 임베디드 MySQL 서버 라이브러리” 장을 참조하십시오.

연결 옵션

Qt MySQL/MariaDB 플러그인은 다음 연결 옵션을 지원합니다:

속성사용 가능한 값
CLIENT_COMPRESS이 옵션이 설정된 경우, 인증이 성공하면 압축 프로토콜로 전환합니다
CLIENT_FOUND_ROWS설정된 경우, 변경된 행 대신 검색된 행을 전송합니다
CLIENT_IGNORE_SPACE이 옵션이 설정된 경우, '(' 앞의 공백을 무시합니다.
CLIENT_NO_SCHEMA이 옵션이 설정된 경우, database.table.column 구문을 허용하지 않습니다
CLIENT_INTERACTIVE이 옵션이 설정된 경우, 클라이언트를 대화형으로 취급합니다
MYSQL_OPT_PROTOCOL사용할 프로토콜을 명시적으로 지정합니다:
MYSQL_PROTOCOL_TCP: TCP 연결을 사용합니다(setHostname()을 통해 IP/호스트 이름 지정). MYSQL_PROTOCOL_SOCKET: UNIX_SOCKET에 지정된 소켓을 통해 연결 MYSQL_PROTOCOL_PIPE: UNIX_SOCKET에 지정된 명명된 파이프를 통해 연결 MYSQL_PROTOCOL_MEMORY: MYSQL_SHARED_MEMORY_BASE_NAME에 지정된 공유 메모리를 통해 연결
UNIX_SOCKET사용할 소켓 또는 명명된 파이프를 지정합니다. UNIX_SOCKET이라고 불리지만 Windows에서도 사용할 수 있습니다.
MYSQL_SHARED_MEMORY_BASE_NAME사용할 공유 메모리 세그먼트 이름을 지정합니다.
MYSQL_OPT_RECONNECTTRUE 또는 1: 연결이 끊어진 후 자동으로 다시 연결합니다.
FALSE 또는 0: 연결이 끊어진 후 자동으로 다시 연결하지 않습니다(기본값).
‘자동 재연결 제어’를 참조하십시오.
MYSQL_OPT_CONNECT_TIMEOUT초 단위의 연결 타임아웃
MYSQL_OPT_READ_TIMEOUT서버에서 데이터를 읽으려는 각 시도마다 적용되는 타임아웃(초)
MYSQL_OPT_WRITE_TIMEOUT서버에 데이터를 쓰기 위한 각 시도당 타임아웃(초)
MYSQL_OPT_LOCAL_INFILE1로 설정하면 로컬 LOAD_DATA 지원이 활성화되며, 설정되지 않았거나 0인 경우 비활성화됩니다
MYSQL_OPT_SSL_MODE서버 연결에 사용할 보안 상태: SSL_MODE_DISABLED, SSL_MODE_PREFERRED, SSL_MODE_REQUIRED, SSL_MODE_VERIFY_CA, SSL_MODE_VERIFY_IDENTITY. MySQL 5.7.10 이상에 링크된 경우에만 사용할 수 있습니다.
MYSQL_OPT_TLS_VERSION클라이언트가 암호화된 연결에 허용하는 프로토콜 목록입니다. 이 값은 사용되는 MySQL 서버 버전에 따라 'TLSv1', 'TLSv1.1', 'TLSv1.2' 또는 'TLSv1.3'의 조합일 수 있습니다. MySQL 5.7.11 이상 또는 MariaDB C Connector 3.1.10에 링크된 경우에만 사용할 수 있습니다.
MYSQL_OPT_SSL_KEY / SSL_KEY (사용 중단됨)클라이언트 개인 키 파일의 경로 이름
MYSQL_OPT_SSL_CERT / SSL_CERT (사용 중단됨)클라이언트 공개 키 인증서 파일의 경로 이름
MYSQL_OPT_SSL_CA / SSL_CA (사용 중단됨)인증 기관(CA) 인증서 파일의 경로명
MYSQL_OPT_SSL_CAPATH / SSL_CAPATH (사용 중단됨)신뢰할 수 있는 SSL CA 인증서 파일이 포함된 디렉터리의 경로명
MYSQL_OPT_SSL_CIPHER / SSL_CIPHER (사용 중단됨)SSL 암호화에 허용되는 암호 목록
MYSQL_OPT_SSL_CRL인증서 해지 목록(CRL)이 포함된 파일의 경로명
MYSQL_OPT_SSL_CRLPATH인증서 해지 목록이 포함된 파일이 있는 디렉터리의 경로명
MYSQL_OPT_SSL_VERIFY_SERVER_CERTTRUE 또는 1: 서버의 공통 이름(Common Name) 신원 확인을 활성화합니다(기본값).
FALSE 또는 0: 서버의 공통 이름(Common Name) 신원 확인을 활성화합니다.
MySQL 5.7.11 또는 MariaDB에 링크된 경우에만 사용할 수 있으며, MySQL 8.0에서 제거되었습니다.

연결 옵션에 대한 자세한 내용은 mysql_options() MySQL 문서를 참조하십시오.

Unix 및 macOS에서 QMYSQL 플러그인을 빌드하는 방법

MySQL/MariaDB 헤더 파일과 공유 라이브러리 libmysqlclient.<so|dylib> / libmariadb.<so|dylib> 가 필요합니다. 사용 중인 Linux 배포판에 따라 일반적으로 "mysql-devel" 또는 "mariadb-devel"이라고 불리는 패키지를 설치해야 할 수도 있습니다.

qt-cmake 에 MySQL/MariaDB 헤더 파일과 공유 라이브러리의 위치를 지정하고(여기서는 MySQL/MariaDB가 /usr/local 에 설치되어 있다고 가정합니다), 다음 명령을 실행하여 빌드하십시오:

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_source_directory>/qtbase/src/plugins/sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>/<platform> -DMySQL_ROOT="/usr/local/mysql"
cmake --build .
cmake --install .

Windows에서 QMYSQL 플러그인을 빌드하는 방법

MySQL 설치 파일(예: MySQL 웹 설치 프로그램 또는 MariaDB C 커넥터)을 구해야 합니다. 설치 프로그램을 실행하고, 사용자 지정 설치를 선택한 다음, 사용 중인 Qt 설치 버전(x86 또는 x64)과 일치하는 MySQL C 커넥터를 설치하십시오. 설치가 완료된 후 필요한 파일이 있는지 확인하십시오:

  • <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 커넥터는 더 이상 독립형 설치 구성 요소로 제공되지 않습니다. 대신, 전체 MySQL 서버(x64 전용) 또는 MariaDB C 커넥터를 설치하면 mysql.h 및 libmysql.* 를 사용할 수 있습니다.

다음과 같이 플러그인을 빌드하십시오(여기서는 <MySQL dir> 이 C:\mysql-8.0.22-winx64 과 동일하다고 가정합니다):

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform> -DMySQL_ROOT="C:\mysql-8.0.22-winx64"
cmake --build .
cmake --install .

애플리케이션을 배포할 때는 설치 패키지에 libmysql.dll / libmariadb.dll을 포함해야 합니다. 이 파일들은 애플리케이션 실행 파일과 동일한 폴더에 위치해야 합니다. libmysql.dll의 경우 vcredist.exe를 통해 설치할 수 있는 MSVC 런타임 라이브러리가 추가로 필요합니다.

Oracle Call Interface(OCI)용 QOCI

Qt OCI 플러그인은 사용 중인 인스턴트 클라이언트 버전에 따라 Oracle 데이터베이스에 대한 연결을 지원합니다. 이는 Oracle이 지원한다고 명시한 내용에 따라 달라집니다. 플러그인은 데이터베이스 버전을 자동으로 감지하여 그에 따라 기능을 활성화합니다.

tnsnames.ora 파일 없이도 Oracle 데이터베이스에 연결할 수 있습니다. 이를 위해서는 데이터베이스 SID를 데이터베이스 이름으로 드라이버에 전달하고, 호스트명을 지정해야 합니다.

OCI 사용자 인증

Qt OCI 플러그인은 외부 자격 증명(OCI_CRED_EXT)을 사용한 인증을 지원합니다. 일반적으로 이는 데이터베이스 서버가 자체 인증 메커니즘 대신 운영 체제에서 제공하는 사용자 인증을 사용함을 의미합니다.

QSqlDatabase 로 연결을 열 때 사용자 이름과 비밀번호를 비워두면 외부 자격 증명 인증을 사용할 수 있습니다.

OCI BLOB/LOB 지원

BLOB(Binary Large Objects)을 읽고 쓸 수 있지만, 이 과정에서 많은 메모리가 필요할 수 있으므로 주의하십시오. LOB 필드를 선택하려면 전진 전용 쿼리를 사용해야 합니다( QSqlQuery::setForwardOnly() 참조).

BLOB 삽입은 BLOB을 자리 표시자에 바인딩하는 준비된 쿼리를 사용하거나, 내부적으로 준비된 쿼리를 사용하는 QSqlTableModel 를 통해 수행해야 합니다.

연결 옵션

Qt OCI 플러그인은 다음 연결 옵션을 지원합니다:

속성사용 가능한 값
OCI_ATTR_PREFETCH_ROWSOCI 속성 OCI_ATTR_PREFETCH_ROWS를 지정된 값으로 설정합니다
OCI_ATTR_PREFETCH_MEMORYOCI 속성 OCI_ATTR_PREFETCH_MEMORY를 지정된 값으로 설정합니다.
OCI_AUTH_MODEOCI_SYSDBA: SYSDBA 액세스 인증
OCI_SYSOPER: SYSOPER 액세스 인증
OCI_DEFAULT: 일반 액세스 인증
액세스 모드에 대한 자세한 내용은 OCISessionBegin을 참조하십시오

Unix 및 macOS에서 OCI 플러그인 빌드 방법

" - Basic"과 "Instant Client Package - SDK"만 있으면 됩니다.

드라이버 빌드에 필요한 Oracle 라이브러리 파일:

  • libclntsh.<so|dylib> (모든 버전)

qt-cmake 에 오라클 헤더 파일과 공유 라이브러리의 위치를 지정하고 빌드하십시오.

Instant Client Package SDK의 RPM 패키지를 설치했다고 가정합니다(버전 번호는 상황에 맞게 조정해야 합니다):

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_source_directory>/qtbase/src/plugins/sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>/<platform> -DOracle_ROOT="/usr/include/oracle/21/client64"
cmake --build .
cmake --install .

참고: Oracle Instant Client 패키지를 사용하는경우 , OCI SQL 플러그인을 빌드할 때와 OCI SQL 플러그인을 사용하는 애플리케이션을 실행할 때 LD_LIBRARY_PATH를 설정해야 합니다.

Windows에서 OCI 플러그인을 빌드하는 방법

Oracle Client 설치 CD에 포함된 Oracle Client 설치 프로그램에서 “Programmer” 옵션을 선택하면 일반적으로 플러그인을 빌드하는 데 충분합니다. 일부 Oracle Client 버전의 경우, “Call Interface (OCI)” 옵션이 제공된다면 이 옵션도 선택해야 할 수 있습니다.

다음과 같이 플러그인을 빌드하십시오(여기서는 Oracle Client가 C:\oracle 에, SDK가 C:\oracle\sdk 에 설치되어 있다고 가정합니다):

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform> -DOracle_ROOT="C:\oracle"
cmake --build .
cmake --install .

애플리케이션을 실행할 때는 PATH 환경 변수에 oci.dll 경로를 추가해야 합니다:

set PATH=%PATH%;C:\oracle

ODBC(Open Database Connectivity)용 QODBC

ODBC는 공통 인터페이스를 사용하여 여러 DBMS에 연결할 수 있게 해주는 범용 인터페이스입니다. QODBC 드라이버를 사용하면 ODBC 드라이버 관리자에 연결하여 사용 가능한 데이터 소스에 접근할 수 있습니다. 단, 시스템에 설치된 ODBC 드라이버 관리자에 대한 ODBC 드라이버를 별도로 설치하고 구성해야 합니다. QODBC 플러그인을 사용하면 Qt 애플리케이션에서 이러한 데이터 소스를 활용할 수 있습니다.

참고: 네이티브 드라이버가 제공되는 경우, ODBC 드라이버 대신 네이티브 드라이버를 사용해야 합니다 . 네이티브 드라이버를 사용할 수 없는 경우, ODBC 지원은 호환되는 데이터베이스에 대한 대체 수단으로 활용될 수 있습니다.

Windows에서는 ODBC 드라이버 관리자가 기본적으로 설치되어 있습니다. Unix 시스템의 경우, 먼저 설치해야 하는 몇 가지 구현체가 있습니다. 애플리케이션의 모든 최종 사용자에게 ODBC 드라이버 관리자가 설치되어 있어야 하며, 그렇지 않으면 QODBC 플러그인이 작동하지 않는다는 점에 유의하십시오.

ODBC 데이터 소스에 연결할 때는 실제 데이터베이스 이름 대신 ODBC 데이터 소스 이름(DSN)을 ` QSqlDatabase::setDatabaseName()` 함수에 전달해야 합니다. 또한 FILEDSN(*.dsn) 파일 이름이나 완전한 ODBC 드라이버 문자열을 전달할 수도 있습니다. 드라이버 문자열을 전달할 때는 모든 매개변수(사용자 이름, 비밀번호 등)가 올바르게 이스케이프 처리되었는지 확인해야 합니다. QSqlDatabase 함수를 통해 사용자 이름이나 비밀번호를 전달하면, QODBC 플러그인에서 자동으로 이스케이프 처리를 수행합니다.

QODBC 플러그인을 사용하려면 ODBC 호환 드라이버 매니저 버전 2.0 이상이 필요합니다. 일부 ODBC 드라이버는 버전 2.0 호환을 표방하지만, 필요한 모든 기능을 제공하지는 않습니다. 따라서 QODBC 플러그인은 연결이 설정된 후 데이터 소스를 사용할 수 있는지 확인하고, 확인에 실패하면 작동을 거부합니다. 이 동작이 마음에 들지 않는 경우, qsql_odbc.cpp 파일에서 #define ODBC_CHECK_DRIVER 줄을 삭제할 수 있습니다. 이 작업은 전적으로 사용자의 책임 하에 수행하십시오!

기본적으로 Qt는 ODBC 드라이버가 ODBC 2.x 드라이버처럼 동작하도록 지시합니다. 그러나 일부 드라이버 관리자/ODBC 3.x 드라이버 조합(예: unixODBC/MaxDB ODBC)의 경우, ODBC 드라이버가 2.x 드라이버처럼 동작하도록 설정하면 드라이버 플러그인이 예기치 않은 동작을 보일 수 있습니다. 이 문제를 방지하려면, ` open your database connection`을 호출하기 전에 ` setting the connect option `( "SQL_ATTR_ODBC_VERSION=SQL_OV_ODBC3" )을 사용하여 ODBC 드라이버가 3.x 드라이버처럼 동작하도록 설정하십시오. 이 설정은 SQLSTATE 등을 포함하여 ODBC 드라이버 동작의 여러 측면에 영향을 미친다는 점에 유의하십시오. 이 연결 옵션을 설정하기 전에, 예상되는 동작 차이에 대해 ODBC 문서를 참조하십시오.

ODBC 데이터 소스 액세스가 매우 느린 경우, ODBC 데이터 소스 관리자에서 ODBC 호출 추적 기능이 비활성화되어 있는지 확인하십시오.

일부 드라이버는 스크롤 가능한 커서를 지원하지 않습니다. 이 경우, ` QSqlQuery::setForwardOnly()` 모드의 쿼리만 정상적으로 사용할 수 있습니다.

타임스탬프 지원

ODBC는 시간대나 이와 유사한 정보가 전혀 포함되지 않은 TIMESTAMP_STRUCT를 사용합니다. 이로 인해 QDateTime 는 시간대를 전혀 고려하지 않은 채로 사용됩니다.

참고: 향후 변경될 수 있습니다.

ODBC 저장 프로시저 지원

Microsoft SQL Server의 경우, RETURN 문을 사용하거나 여러 결과 집합을 반환하는 저장 프로시저가 반환하는 결과 집합은 QSqlQuery::setForwardOnly()를 사용하여 쿼리의 ‘forward only’ 모드를 ‘forward’로 설정해야만 액세스할 수 있습니다.

// STORED_PROC uses the return statement or returns multiple result sets
QSqlQuery query;
query.setForwardOnly(true);
query.exec("{call STORED_PROC}");

참고: 저장 프로시저의 return 문이 반환하는 값은 무시됩니다.

ODBC 유니코드 지원

UNICODE가 정의되어 있으면 QODBC 플러그인은 유니코드 API를 사용합니다. Windows 기반 시스템에서는 이것이 기본값입니다. ODBC 드라이버와 DBMS도 유니코드를 지원해야 한다는 점에 유의하십시오.

Oracle 9 ODBC 드라이버(Windows)의 경우, ODBC 드라이버 관리자에서 "SQL_WCHAR 지원"을 선택해야 합니다. 그렇지 않으면 Oracle이 모든 유니코드 문자열을 로컬 8비트 형식으로 변환합니다.

연결 옵션

Qt ODBC 플러그인은 다음 연결 옵션을 지원합니다:

속성사용 가능한 값
SQL_ATTR_ACCESS_MODESQL_MODE_READ_ONLY: 데이터베이스를 읽기 전용 모드로 엽니다
SQL_MODE_READ_WRITE: 데이터베이스를 읽기-쓰기 모드로 엽니다(기본값)
SQL_ATTR_LOGIN_TIMEOUT로그인 시 데이터베이스 연결을 기다리는 시간(초)(값이 0이면 무한정 기다림)
SQL_ATTR_CONNECTION_TIMEOUT데이터베이스에 대한 요청을 기다리는 시간(초)(값이 0이면 무한정 대기함)
SQL_ATTR_CURRENT_CATALOG이 연결에 사용할 카탈로그(데이터베이스)
SQL_ATTR_METADATA_IDSQL_TRUE: 카탈로그 함수의 문자열 인수가 식별자로 처리됩니다
SQL_FALSE: 카탈로그 함수의 문자열 인수가 식별자로 처리되지 않습니다
SQL_ATTR_PACKET_SIZE네트워크 패킷 크기를 바이트 단위로 지정합니다.
SQL_ATTR_TRACEFILE추적 파일의 이름을 포함하는 문자열
SQL_ATTR_TRACESQL_OPT_TRACE_ON: 데이터베이스 쿼리 추적 활성화
SQL_OPT_TRACE_OFF: 데이터베이스 쿼리 추적 비활성화 (기본값)
SQL_ATTR_CONNECTION_POOLING환경 수준에서 연결 풀링을 활성화하거나 비활성화합니다.
SQL_CP_DEFAULT, SQL_CP_OFF: 연결 풀링이 해제됨(기본값)
SQL_CP_ONE_PER_DRIVER: 각 드라이버에 대해 단일 연결 풀이 지원됨
SQL_CP_ONE_PER_HENV: 각 환경에 대해 단일 연결 풀이 지원됨
SQL_ATTR_ODBC_VERSIONSQL_OV_ODBC3: 드라이버가 ODBC 3.x 드라이버로 작동해야 합니다.
SQL_OV_ODBC2: 드라이버가 ODBC 2.x 드라이버로 작동해야 합니다(기본값).
SQL_ATTR_CP_MATCHSQL_CP_STRICT_MATCH, SQL_CP_RELAXED_MATCH 또는 SQL_CP_MATCH_DEFAULT 중 하나일 수 있습니다. 자세한 내용은 SQLConnect() ODBC 문서를 참조하십시오.
SQL_PERCENT_ENCODE_PASSWORD이는 ODBC 표준에서 정의한 것처럼 중괄호 대신 퍼센트 인코딩으로 특수 문자를 인코딩해야 하는 드라이버(Oracle, PostgreSQL)를 지원하기 위한 사용자 정의 Qt ODBC 드라이버 옵션입니다.

연결 옵션에 대한 더 자세한 정보는 SQLSetConnectAttr() ODBC 문서를 참조하십시오.

Unix 및 macOS에서 ODBC 플러그인을 빌드하는 방법

unixODBC를 사용하는 것이 좋습니다. 최신 버전과 ODBC 드라이버는 http://www.unixodbc.org에서 확인할 수 있습니다. unixODBC 헤더 파일과 공유 라이브러리가 필요합니다.

qt-cmake 에 unixODBC 헤더 파일과 공유 라이브러리의 위치를 지정하고(여기서는 unixODBC가 /usr/local/unixODBC 에 설치되어 있다고 가정합니다), 다음 명령을 실행하여 빌드하십시오:

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_source_directory>/qtbase/src/plugins/sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>/<platform> -DODBC_INCLUDE_DIR="/usr/local/unixODBC/include" -DODBC_LIBRARY="/usr/local/unixODBC/lib/libodbc.<so|dylib>"
cmake --build .
cmake --install .

Windows에서 ODBC 플러그인을 빌드하는 방법

ODBC 헤더 및 포함 파일은 이미 올바른 디렉터리에 설치되어 있어야 합니다. 다음과 같이 플러그인을 빌드하기만 하면 됩니다:

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform>
cmake --build .
cmake --install .

PostgreSQL용 QPSQL (버전 7.3 이상)

QPSQL 드라이버는 PostgreSQL 서버 버전 7.3 이상을 지원합니다.

PostgreSQL에 대한 자세한 내용은 http://www.postgresql.org을 참조하십시오.

타임스탬프 지원

Qt 6.8부터 ` QDateTime ` 값은 삽입 시 UTC로 변환되며, 조회 시에는 다시 UTC에서 원래 값으로 변환됩니다. 이를 위해 드라이버는 open() 호출 시 연결 시간대를 UTC로 설정합니다(SET TIME ZONE 'UTC'). PostgreSQL에는 `timestamptz` 열 유형이 있지만, 삽입 시 사용된 시간대는 유지되지 않으므로 검색된 모든 QDateTime 값은 UTC로 반환됩니다.

QPSQL 유니코드 지원

QPSQL 드라이버는 연결하려는 PostgreSQL 데이터베이스가 유니코드를 지원하는지 여부를 자동으로 감지합니다. 서버가 유니코드를 지원하는 경우 자동으로 유니코드가 사용됩니다. 단, 이 드라이버는 UTF-8 인코딩만 지원합니다. 데이터베이스에서 다른 인코딩을 사용하는 경우, 서버는 유니코드 변환 기능을 지원하도록 컴파일되어야 합니다.

유니코드 지원 기능은 PostgreSQL 7.1 버전에서 도입되었으며, 서버와 클라이언트 라이브러리 모두 멀티바이트 지원이 포함된 상태로 컴파일된 경우에만 작동합니다. 멀티바이트가 활성화된 PostgreSQL 서버를 설정하는 방법에 대한 자세한 내용은 『PostgreSQL 관리자 가이드』 5장에서 확인할 수 있습니다.

QPSQL 대소문자 구분

PostgreSQL 데이터베이스는 테이블 생성 시 테이블명이나 필드명을 따옴표로 묶은 경우에만 대소문자를 구분합니다. 예를 들어, 다음과 같은 SQL 쿼리의 경우:

CREATE TABLE "testTable" ("id" INTEGER);

와 같이 작성된 SQL 쿼리는 생성 시 사용된 대소문자 구분을 그대로 유지한 상태로 테이블이나 필드에 접근할 수 있습니다. 반면, 생성 시 테이블이나 필드 이름에 따옴표를 사용하지 않았다면, 실제 테이블명이나 필드명은 소문자로 처리됩니다. 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의 전진 전용 쿼리 지원

전진 전용 쿼리를 사용하려면 PostgreSQL 클라이언트 라이브러리 버전 9.2 이상으로 QPSQL 플러그인을 빌드해야 합니다. 플러그인이 이전 버전으로 빌드된 경우 전진 전용 모드를 사용할 수 없으며, ` true ` 매개변수를 사용하여 ` QSqlQuery::setForwardOnly()`를 호출해도 아무런 효과가 없습니다.

경고: PostgreSQL 버전 9.2 이상으로 QPSQL 플러그인을 빌드한경우 , 애플리케이션을 배포할 때 libpq 버전 9.2 이상을 함께 제공해야 합니다. 그렇지 않으면 QPSQL 플러그인을 로드하는 과정에서 다음 메시지와 함께 오류가 발생합니다:

QSqlDatabase: QPSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMARIADB QODBC QPSQL
Could not create database object

단방향 모드에서 결과를 탐색하는 동안 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...
        }
    }
}

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가 서로 다른 데이터베이스 연결을 사용하거나, while 루프가 끝난 후에 query2를 실행하면 이 문제는 발생하지 않습니다.

참고: tables(), primaryIndex()와 같은 QSqlDatabase 의일부 메서드는 암시적으로 SQL 쿼리를 실행하므로, 단방향 쿼리의 결과 집합을 탐색하는 동안에는 이러한 메서드도 사용할 수 없습니다.

참고: QPSQL은 쿼리 결과가 누락된 것을 감지하면 다음과 같은 경고를 출력합니다:

QPSQLDriver::getResult: Query results lost - probably discarded on executing another SQL query.

연결 옵션

Qt PostgreSQL 플러그인은 connect() PostgreSQL 문서에 명시된 모든 연결 옵션을 준수합니다.

Unix 및 macOS에서 QPSQL 플러그인 빌드 방법

PostgreSQL 클라이언트 라이브러리와 헤더 파일이 설치되어 있어야 합니다.

qt-cmake 가 PostgreSQL 헤더 파일과 공유 라이브러리를 찾을 수 있도록 하려면, 다음 방법대로 플러그인을 빌드하십시오(PostgreSQL 클라이언트가 /usr/local/pgsql 에 설치되어 있다고 가정함):

mkdir build-psql-driver
cd build-psql-driver

qt-cmake -G Ninja <qt_source_directory>/qtbase/src/plugins/sqldrivers-DCMAKE_INSTALL_PREFIX=<qt_installation_path>/<platform> -DPostgreSQL_ROOT="/usr/local/pgsql"
cmake --build .
cmake --install .

Windows에서 QPSQL 플러그인을 빌드하는 방법

사용 중인 컴파일러에 적합한 PostgreSQL 개발자 라이브러리를 설치하십시오. PostgreSQL이 C:\pgsql 에 설치되어 있다고 가정할 때, 다음과 같이 플러그인을 빌드하십시오:

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform> -DPostgreSQL_ROOT="C:\pgsql"
cmake --build .
cmake --install .

MinGW 사용자는 다음 온라인 문서를 참고하시기 바랍니다: PostgreSQL MinGW/Native Windows.

응용 프로그램을 배포할 때는 설치 패키지에 libpq.dll 파일을 포함시켜야 합니다. 이 파일은 응용 프로그램 실행 파일과 동일한 폴더에 위치해야 합니다.

IBM DB2용 QDB2 (버전 7.1 이상)

Qt DB2 플러그인을 사용하면 IBM DB2 데이터베이스에 액세스할 수 있습니다. 이 플러그인은 IBM DB2 v7.1 및 7.2에서 테스트를 거쳤습니다. QDB2 플러그인을 컴파일하는 데 필요한 헤더 파일과 라이브러리 파일이 포함된 IBM DB2 개발용 클라이언트 라이브러리를 설치해야 합니다.

QDB2 드라이버는 준비된 쿼리, 유니코드 문자열의 읽기/쓰기, BLOB의 읽기/쓰기를 지원합니다.

DB2에서 저장 프로시저를 호출할 때는 단방향 쿼리를 사용하는 것이 좋습니다( QSqlQuery::setForwardOnly() 참조).

연결 옵션

Qt IBM DB2 플러그인은 다음 연결 옵션을 지원합니다:

속성사용 가능한 값
SQL_ATTR_ACCESS_MODESQL_MODE_READ_ONLY: 데이터베이스를 읽기 전용 모드로 엽니다
SQL_MODE_READ_WRITE: 데이터베이스를 읽기-쓰기 모드로 엽니다(기본값)
SQL_ATTR_LOGIN_TIMEOUT로그인 시 데이터베이스 연결을 기다리는 시간(초)(최대: 32767, 0을 지정하면 무한정 대기)

Unix 및 macOS에서 QDB2 플러그인을 빌드하는 방법

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_source_directory>/qtbase/src/plugins/sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>/<platform> -DDB2_ROOT="/usr/local/db2"
cmake --build .
cmake --install .

Windows에서 QDB2 플러그인 빌드 방법

DB2 헤더 및 인클루드 파일은 이미 적절한 디렉터리에 설치되어 있어야 합니다. 다음 단계에 따라 플러그인을 빌드하기만 하면 됩니다:

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform> -DDB2_ROOT="C:\db2"
cmake --build .
cmake --install .

SQLite용 QSQLITE (버전 3 이상)

Qt SQLite 플러그인을 사용하면 SQLite 데이터베이스에 접근할 수 있습니다. SQLite는 인-프로세스(in-process) 데이터베이스로, 별도의 데이터베이스 서버가 필요하지 않습니다. SQLite는 단일 파일을 기반으로 작동하며, 연결을 열 때 이 파일을 데이터베이스 이름으로 지정해야 합니다. 파일이 존재하지 않으면 SQLite가 해당 파일을 생성하려고 시도합니다. SQLite는 메모리 내 데이터베이스와 임시 데이터베이스도 지원합니다. 데이터베이스 이름으로 각각 ":memory:" 또는 빈 문자열을 전달하기만 하면 됩니다.

SQLite에는 다중 사용자 및 다중 트랜잭션과 관련하여 몇 가지 제한 사항이 있습니다. 서로 다른 트랜잭션에서 동일한 리소스에 대한 읽기/쓰기 작업을 시도할 경우, 한 트랜잭션이 커밋되거나 롤백될 때까지 애플리케이션이 멈출 수 있습니다. Qt SQLite 드라이버는 타임아웃이 발생할 때까지 잠긴 리소스에 대한 쓰기 작업을 재시도합니다( QSqlDatabase::setConnectOptions()의 QSQLITE_BUSY_TIMEOUT 참조).

SQLite에서는 INTEGER PRIMARY KEY 열을 제외하고 모든 열에 어떤 유형의 값이든 저장할 수 있습니다. 예를 들어, INTEGER로 선언된 열은 한 행에는 정수 값을, 다음 행에는 텍스트 값을 포함할 수 있습니다. 이는 SQLite가 값의 유형을 해당 값 자체와 연관 짓는 것이지, 값이 저장된 열과 연관 짓지 않기 때문입니다. 그 결과, QSqlField::metaType() 함수가 반환하는 유형은 해당 필드의 권장 유형만을 나타낼 뿐입니다. 이를 바탕으로 실제 유형을 추측해서는 안 되며, 개별 값의 유형을 반드시 확인해야 합니다.

SELECT 문이 실행되는 동안 드라이버는 업데이트를 위해 잠겨 있습니다. Qt의 항목 뷰는 필요에 따라 데이터를 가져오기 때문에( QSqlTableModel 의 경우 QSqlQuery::fetchMore()를 통해), QSqlTableModel 를 사용할 때 문제가 발생할 수 있습니다.

SQLite에 대한 정보는 http://www.sqlite.org에서 확인할 수 있습니다.

타임스탬프 지원

SQLite에는 별도의 타임스탬프 열 유형이 없습니다. QDateTime 는 Qt::ISODateWithMs 형식으로 포맷된 문자열로 저장되므로, QDateTime 타임존 정보는 삽입 및 선택 시 유지됩니다.

연결 옵션

Qt SQLite 플러그인은 다음 연결 옵션을 지원합니다:

속성사용 가능한 값
QSQLITE_BUSY_TIMEOUT바쁜 상태 핸들러의 타임아웃(밀리초 단위, 값 <= 0: 비활성화됨). 자세한 내용은 SQLite 문서를 참조하십시오
QSQLITE_USE_QT_VFS이 속성이 설정된 경우, 데이터베이스는 Qt의 VFS를 사용하여 열리므로 QFile 를 통해 데이터베이스를 열 수 있습니다. 이렇게 하면 읽기-쓰기 가능한 위치(예: Android 공유 저장소)뿐만 아니라 읽기 전용 리소스(예: qrc 또는 Android 자산)에서도 데이터베이스를 열 수 있습니다. 읽기 전용 리소스에서 데이터베이스를 열 때는 QSQLITE_OPEN_READONLY 속성도 함께 추가해야 한다는 점에 유의하십시오. 그렇지 않으면 데이터베이스 열기에 실패합니다.
QSQLITE_OPEN_READONLY이 속성이 설정되면 데이터베이스는 읽기 전용 모드로 열리며, 데이터베이스가 존재하지 않을 경우 열기에 실패합니다. 그렇지 않으면 데이터베이스는 읽기-쓰기 모드로 열리며, 데이터베이스 파일이 아직 존재하지 않을 경우 생성됩니다(기본값).
QSQLITE_OPEN_URI지정된 파일 이름은 URI로 해석됩니다. SQLITE_OPEN_URI를 참조하십시오.
QSQLITE_ENABLE_SHARED_CACHE이 옵션이 설정되면 데이터베이스는 공유 캐시 모드로 열리고, 그렇지 않으면 개인 캐시 모드로 열립니다.
QSQLITE_ENABLE_REGEXP설정된 경우, 플러그인은 쿼리에서 사용할 수 있는 'regex' 함수를 정의하며, 정규식 쿼리의 평가에는 QRegularExpression 가 사용됩니다
QSQLITE_NO_USE_EXTENDED_RESULT_CODESSQLite에서 확장 결과 코드 기능의 사용을 비활성화합니다.
QSQLITE_ENABLE_NON_ASCII_CASE_FOLDING이 옵션이 설정되면, 플러그인은 비 ASCII 문자의 대소문자 변환을 올바르게 수행하기 위해 'lower' 및 'upper' 함수를 QString 함수로 대체합니다.
QSQLITE_OPEN_NOFOLLOW이 옵션이 설정되면, 데이터베이스 파일 이름에 심볼릭 링크가 포함될 수 없습니다

QSQLITE 플러그인 빌드 방법

SQLite 버전 3은 Qt 내에 타사 라이브러리로 포함되어 있습니다. qt-cmake 명령줄에 -DFEATURE_system_sqlite=OFF 매개변수를 전달하여 빌드할 수 있습니다.

Qt에 포함된 SQLite 라이브러리를 사용하지 않으려면, qt-cmake 명령줄에 -DFEATURE_system_sqlite=ON 를 전달하여 운영 체제의 SQLite 라이브러리를 사용할 수 있습니다. 이는 설치 크기를 줄이고 보안 권고 사항을 추적해야 하는 구성 요소를 하나 제거해 주므로, 가능한 경우 이 방법을 권장합니다.

Unix 및 macOS의 경우( $SQLITE 을 SQLite가 위치한 디렉터리로 대체하십시오):

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_source_directory>/qtbase/src/plugins/sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>/<platform> -DFEATURE_system_sqlite=ON -DCMAKE_INCLUDE_PATH="$SQLITE/include" -DCMAKE_LIBRARY_PATH="$SQLITE/lib"
cmake --build .
cmake --install .

Windows의 경우 (SQLite가 C:\SQLITE 에 설치되어 있다고 가정):

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform> -DFEATURE_system_sqlite=ON -DCMAKE_INCLUDE_PATH="C:\SQLITE\include" -DCMAKE_LIBRARY_PATH="C:\SQLITE\lib"
cmake --build .
cmake --install .

REGEXP 연산자 활성화

SQLite에는 REGEXP 연산자가 포함되어 있습니다. 하지만 필요한 구현은 사용자가 직접 제공해야 합니다. 편의를 위해 setting the connect option QSQLITE_ENABLE_REGEXP 에서 the database connection is opened 실행 전에 기본 구현을 활성화할 수 있습니다. 그러면 "column REGEXP 'pattern'"과 같은 SQL 문은 기본적으로 다음과 같은 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를 빌드할 때 ` SQLITE_DEFAULT_FILE_FORMAT ` 정의값을 설정함으로써 특정 파일 형식으로 쓰도록 강제할 수 있습니다.

Mimer SQL 버전 11 이상용 QMIMER

Qt Mimer SQL 플러그인을 사용하면 Mimer SQL RDBMS를 활용할 수 있습니다. Mimer SQL은 국제 ISO SQL 표준을 준수하는, 작은 메모리 점유량과 확장성, 견고성을 갖춘 관계형 데이터베이스 솔루션을 제공합니다. Mimer SQL은 Windows, Linux, macOS, OpenVMS는 물론 QNX, Android, 임베디드 Linux와 같은 여러 임베디드 플랫폼에서도 사용할 수 있습니다.

Mimer SQL은 유니코드를 완벽하게 지원합니다. 유니코드 데이터를 처리하려면 National Character(NCHAR), National Character Varying(NVARCHAR) 또는 National Character Large Object(NCLOB) 열 유형을 사용해야 합니다. Mimer SQL 및 유니코드에 대한 자세한 내용은 https://developer.mimer.com/features/multilingual-support을 참조하십시오.

타임스탬프 지원

MimerSQL은 시간대에 대한 정보를 전혀 인식하지 않으며, ` QDateTime `은 시간대를 전혀 고려하지 않고 사용됩니다.

참고: 향후 변경될 수 있습니다.

QMIMER 저장 프로시저 지원

Mimer SQL은 SQL 표준(PSM)에 따른 저장 프로시저를 제공하며, 이 플러그인은 IN, OUT, INOUT 매개변수는 물론 결과 집합 프로시저도 완벽하게 지원합니다.

INOUT 및 OUT 매개변수를 사용하는 저장 프로시저 예시:

create procedure inout_proc (INOUT param1 INT, OUT param2 INT)
BEGIN
    set param1 = param1 * 2;
    set param2 = param1 * param1;
END

INOUT 및 OUT 값에 접근하기 위한 소스 코드:

    QSqlDatabase db;
    QSqlQuery query;
    int i1 = 10, i2 = 0;
    query.prepare("call qtestproc(?, ?)");
    query.bindValue(0, i1, QSql::InOut);
    query.bindValue(1, i2, QSql::Out);
    query.exec();

Unix 및 macOS에서 QMIMER 플러그인을 빌드하는 방법

Mimer SQL 헤더 파일과 공유 라이브러리가 필요합니다. https://developer.mimer.com에서 제공되는 Mimer SQL 변형 중 하나를 설치하여 구하십시오.

mkdir build-sqldrivers
cd build-sqldrivers

qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform> -DMimer_INCLUDE_DIR="/usr/include" -DMimer_LIBRARIES="/usr/lib/libmimer.so"
cmake --build .
cmake --install .

Windows에서 QMIMER 플러그인을 빌드하는 방법

Mimer SQL 헤더 파일과 공유 라이브러리가 필요합니다. https://developer.mimer.com에서 제공하는 Mimer SQL 버전 중 하나를 설치하여 구하십시오.

mkdir build-sqldrivers
cd build-sqldrivers

qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform> -DMimer_INCLUDE_DIR="C:\Program Files\Mimer SQL Experience 11.0\dev\include" -DMimer_LIBRARIES="C:\Program Files\Mimer SQL Experience 11.0\dev\lib\amd64\mimapi64.lib|C:\Program Files\Mimer SQL Experience 11.0\dev\lib\x86\mimapi32.lib"
cmake --build .
cmake --install .

Borland InterBase용 QIBASE

Qt InterBase 플러그인을 사용하면 InterBase 및 Firebird 데이터베이스에 접근할 수 있습니다. InterBase는 클라이언트/서버 방식으로 사용하거나, 서버 없이 로컬 파일을 대상으로 작동하는 방식으로 사용할 수 있습니다. 연결을 설정하려면 데이터베이스 파일이 미리 존재해야 합니다. Firebird는 반드시 서버 구성과 함께 사용해야 합니다.

InterBase에서는 데이터베이스 파일이 로컬에 저장되어 있든 다른 서버에 저장되어 있든 상관없이 데이터베이스 파일의 전체 경로를 지정해야 한다는 점에 유의하십시오.

타임스탬프 지원

InterBase는 시간대 정보를 포함하지 않은 UTC 형식으로 타임스탬프를 저장합니다. 이로 인해 QDateTime 는 시간대를 전혀 고려하지 않고 사용됩니다.

Firebird 4.0부터 이 데이터베이스는 시간대가 포함된 타임스탬프를 지원합니다. 시간대 정보는 타임스탬프와 별도로 저장되므로 나중에 올바르게 조회할 수 있습니다. 타임스탬프 처리에 대한 자세한 내용은 Firebird 설명서를 참조하십시오.

연결 옵션

Qt Borland InterBase 플러그인은 다음 연결 옵션을 지원합니다:

속성사용 가능한 값
ISC_DPB_SQL_ROLE_NAME로그인 역할 이름을 지정합니다

QIBASE 플러그인 빌드 방법

QSqlDatabase db;
db.setHostName("MyServer");
db.setDatabaseName("C:\\test.gdb");

이 플러그인을 빌드하려면 InterBase/Firebird 개발 헤더 및 라이브러리가 필요합니다.

GPL과의 라이선스 비호환성으로 인해, Qt 오픈 소스 에디션 사용자는 이 플러그인을 InterBase 상용 에디션에 링크할 수 없습니다. Firebird 또는 InterBase 무료 에디션을 사용해 주십시오.

QIBASE 저장 프로시저

InterBase/Firebird는 OUT 값을 결과 집합으로 반환하므로, 저장 프로시저를 호출할 때 QSqlQuery::bindValue()을 통해 IN 값만 바인딩하면 됩니다. 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

Unix 및 macOS에서 QIBASE 플러그인을 빌드하는 방법

다음 내용은 InterBase 또는 Firebird가 /opt/interbase 에 설치되어 있다고 가정합니다:

InterBase를 사용하는 경우:

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_source_directory>/qtbase/src/plugins/sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>/<platform> -DInterbase_ROOT="/opt/interbase/"
cmake --build .
cmake --install .

선택적으로, CMake 변수 Interbase_INCLUDE_DIR 및 Interbase_LIBRARY 를 사용하여 포함 경로와 라이브러리를 직접 지정할 수 있습니다.

Windows에서 QIBASE 플러그인을 빌드하는 방법

다음 내용은 InterBase 또는 Firebird가 C:\interbase 에 설치되어 있다고 가정합니다:

InterBase를 사용하는 경우:

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform> -DInterbase_ROOT="C:\interbase"
cmake --build .
cmake --install .

선택적으로, CMake 변수 Interbase_INCLUDE_DIR 및 Interbase_LIBRARY 를 사용하여 포함 경로와 라이브러리를 직접 지정할 수 있습니다.

C:\interbase\bin 는 반드시 PATH 내에 있어야 합니다.

문제 해결

항상 프로젝트에서 사용 중인 컴파일러와 동일한 컴파일러로 컴파일된 클라이언트 라이브러리를 사용해야 합니다. 소스 배포판을 구해 클라이언트 라이브러리를 직접 컴파일할 수 없는 경우, 미리 컴파일된 라이브러리가 사용 중인 컴파일러와 호환되는지 반드시 확인해야 합니다. 그렇지 않으면 "정의되지 않은 심볼" 오류가 많이 발생합니다.

플러그인 컴파일은 성공했으나 이후 로드할 수 없는 경우, 다음 단계를 확인하여 원인을 파악하십시오:

  1. 플러그인이 올바른 디렉터리에 있는지 확인하십시오. QApplication::libraryPaths()를 사용하여 Qt가 플러그인을 찾는 위치를 확인할 수 있습니다.
  2. 시스템에 DBMS의 클라이언트 라이브러리가 있는지 확인하십시오. 유닉스에서는 ` ldd ` 명령을 실행하고 매개변수로 플러그인 이름을 전달하십시오(예: ` ldd libqsqlmysql.so`). 클라이언트 라이브러리 중 하나라도 찾을 수 없는 경우 경고 메시지가 표시됩니다. Windows에서는 Visual Studio의 Dependency Walker 또는 Dependencies GUI를 사용하여 종속 라이브러리를 확인할 수 있습니다. Qt Creator 를 통해 프로젝트 패널의 '실행(Run )' 섹션에 있는 ' PATH ' 환경 변수를 업데이트하여 클라이언트 라이브러리가 포함된 폴더의 경로를 추가할 수 있습니다.
  3. MSVC를 사용할 때는 플러그인이 올바른 빌드 유형으로 빌드되었는지 확인하십시오. 디버그 및 릴리스용 MSVC 런타임이 서로 다르기 때문에, Qt 디버그 빌드는 Qt 릴리스 플러그인을 로드할 수 없으며 그 반대의 경우도 마찬가지입니다.
  4. 플러그인을 로드할 때 매우 상세한 디버그 출력을 얻으려면, QT_DEBUG_PLUGINS 환경 변수를 설정한 상태에서 컴파일된 Qt 실행 파일을 실행하십시오.
  5. SQL 하위 시스템에서 발생할 수 있는 디버그 메시지를 확인하려면, 환경 변수 ` QT_LOGGING_RULES `을 ` qt.sql.*.debug=true`으로 설정하여 출력을 활성화하십시오. Windows에서 작업할 때는 콘솔을 활성화하는 것을 잊지 마십시오. 로깅 규칙 설정 방법에 대한 자세한 설명은 Logging Rules 를 참조하십시오.

'플러그인 배포' 가이드를 따랐는지 확인하십시오.

자신만의 데이터베이스 드라이버 작성 방법

QSqlDatabase 는 데이터베이스 드라이버 플러그인을 로드하고 관리하는 역할을 담당합니다. 데이터베이스가 추가되면 ( QSqlDatabase::addDatabase() 참조), 적절한 드라이버 플러그인이 ( QSqlDriverPlugin 를 사용하여) 로드됩니다. QSqlDatabase 은 드라이버 플러그인이 QSqlDriver 및 QSqlResult 에 대한 인터페이스를 제공하도록 의존합니다.

QSqlDriver 는 SQL 데이터베이스 드라이버의 기능을 정의하는 추상 기본 클래스입니다. 여기에는 QSqlDriver::open() 및 QSqlDriver::close()과 같은 함수가 포함됩니다. QSqlDriver 는 데이터베이스에 연결하고 적절한 환경을 구축하는 등의 역할을 담당합니다. 또한, QSqlDriver 는 특정 데이터베이스 API에 적합한 QSqlQuery 객체를 생성할 수 있습니다. 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 플러그인 생성 방법’을 참조하십시오. 또한 QTDIR/qtbase/src/plugins/sqldrivers 에서 Qt와 함께 제공되는 SQL 플러그인에서 이 작업이 어떻게 이루어지는지 확인해 볼 수도 있습니다.

다음 코드는 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); }
};

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.