SQL 데이터베이스 드라이버
Qt SQL 모듈은 드라이버 플러그인을 사용하여 다양한 데이터베이스 API와 통신합니다. Qt의 SQL 모듈 API는 데이터베이스에 독립적이기 때문에 모든 데이터베이스 관련 코드가 이 드라이버 안에 포함되어 있습니다. 여러 드라이버가 Qt와 함께 제공되며 다른 드라이버를 추가할 수 있습니다. 드라이버 소스 코드가 제공되며 자체 드라이버를 작성하기 위한 모델로 사용할 수 있습니다.
지원되는 데이터베이스
아래 표에는 Qt에 포함된 드라이버가 나열되어 있습니다:
드라이버 이름 | DBMS |
---|---|
QDB2 | IBM DB2(버전 7.1 이상) |
QIBASE | 볼랜드 인터베이스 / 파이어버드 |
QMYSQL/MARIADB | MySQL 또는 MariaDB(버전 5.6 이상) |
QOCI | Oracle 통화 인터페이스 드라이버(버전 12.1 이상) |
QODBC | 오픈 데이터베이스 연결(ODBC) - Microsoft SQL Server 및 기타 ODBC 호환 데이터베이스 |
QPSQL | PostgreSQL(버전 7.3 이상) |
QSQLITE | SQLite 버전 3 |
QMIMER | Mimer SQL(버전 11 이상) |
SQLite는 모든 플랫폼에서 최고의 테스트 범위와 지원을 제공하는 인프로세스 데이터베이스 시스템입니다. OCI를 통한 Oracle, PostgreSQL, ODBC 또는 기본 드라이버를 통한 MySQL은 Windows와 Linux에서 잘 테스트되었습니다. 다른 시스템에 대한 지원의 완전성은 클라이언트 라이브러리의 가용성과 품질에 따라 달라집니다.
참고: 드라이버 플러그인을 빌드하려면 데이터베이스 관리 시스템(DBMS)에 적합한 클라이언트 라이브러리가 있어야 합니다. 이는 DBMS가 노출하는 API에 대한 액세스를 제공하며 일반적으로 함께 제공됩니다. 대부분의 설치 프로그램에서는 "개발 라이브러리"를 설치할 수 있으며, 이 라이브러리가 필요합니다. 이러한 라이브러리는 DBMS와의 저수준 통신을 담당합니다. 또한 사용 중인 Qt 아키텍처(32비트 또는 64비트)에 맞는 데이터베이스 라이브러리를 설치해야 합니다.
참고: 오픈 소스 약관에 따라 Qt를 사용하지만 독점 데이터베이스와 함께 사용하는 경우 클라이언트 라이브러리의 라이선스가 LGPL과 호환되는지 확인하세요.
드라이버 빌드하기
특정 드라이버로 Qt 컴파일하기
Qt 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
스크립트는 표준 경로에 없는 경우 필요한 라이브러리 및 include 파일을 감지할 수 없으므로 드라이버별 include 및 라이브러리 경로 변수 또는 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). 그렇지 않으면 변경된 apis로 인해 컴파일 오류가 발생할 수 있습니다. 또한 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 컴파일하기에서 언급했듯이 드라이버를 찾을 수 없거나 활성화되어 있지 않은 경우 CMakeCache.txt를 제거하여 다시 시작하세요.
외부 종속성을 처리해야 하는 현실적인 문제로 인해 SQLite 플러그인만 Qt의 바이너리 빌드와 함께 제공됩니다. Windows용 Qt의 바이너리 빌드에는 ODBC 및 PostgreSQL 플러그인도 포함되어 있습니다. Qt를 모두 다시 빌드하지 않고도 Qt 설치에 추가 드라이버를 추가하려면 전체 Qt 빌드 디렉토리 외부에 qtbase/src/plugins/sqldrivers
디렉터리를 구성하고 빌드할 수 있습니다. 각 드라이버를 개별적으로 구성할 수 없으며 모든 드라이버를 한 번에 구성할 수만 있습니다. 하지만 드라이버는 개별적으로 빌드할 수 있습니다.
참고: 빌드가 완료된 후 플러그인을 설치하려면 CMAKE_INSTALL_PREFIX
을 지정해야 합니다.
드라이버 세부 정보
MySQL 또는 MariaDB 5.6 이상용 QMYSQL
MariaDB는 GNU 일반 공중 사용 허가서에 따라 무료 오픈 소스 소프트웨어로 유지되도록 고안된 MySQL의 포크입니다. MariaDB는 MySQL과의 높은 호환성을 유지하기 위해 라이브러리 바이너리 패리티를 통한 드롭인 대체 기능과 MySQL API 및 명령어와의 정확한 매칭을 보장합니다. 따라서 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이라고도 하며 윈도우에서도 사용할 수 있습니다. |
MYSQL_공유_메모리_베이스_이름 | 사용할 공유 메모리 세그먼트 이름을 지정합니다. |
mysql_opt_reconnect | TRUE 또는 1: 연결 끊김 후 자동으로 재연결 FALSE 또는 0: 연결 끊김 후 자동 재연결 없음(기본값) 자동 재연결 제어 참조 |
MYSQL_OPT_CONNECT_TIMEOUT | 연결 시간 제한(초) |
MYSQL_OPT_READ_TIMEOUT | 서버에서 읽기를 시도할 때마다 제한 시간(초) |
MYSQL_OPT_WRITE_TIMEOUT | 서버에 대한 각 쓰기 시도에 대한 시간 제한(초) |
mysql_opt_local_infile | 로컬 LOAD_DATA 지원을 활성화하려면 1로 설정하고, 설정하지 않으면 비활성화하거나 0으로 설정합니다. |
mysql_opt_ssl_mode | 서버 연결에 사용할 보안 상태입니다: SSL_MODE_DISABLED, SSL_MODE_PREFERRED, SSL_MODE_REQUIRED, SSL_MODE_VERIFY_CA, SSL_MODE_VERIFY_IDENTITY. |
MYSQl_OPT_TLS_VERSION | 클라이언트가 암호화된 연결에 대해 허용하는 프로토콜 목록입니다. 이 값은 사용되는 MySQL 서버 버전에 따라 'TLSv1' , 'TLSv1.1', 'TLSv1.2' 또는 'TLSv1.3'의 조합이 될 수 있습니다. |
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 | 인증서 해지 목록이 포함된 파일의 경로 이름 |
MYSQl_OPT_S_SSL_CRLPATH | 인증서 해지 목록이 포함된 파일이 포함된 디렉터리의 경로 이름입니다. |
연결 옵션에 대한 자세한 내용은 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 Server(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 런타임 라이브러리가 추가로 필요합니다.
오라클 호출 인터페이스(OCI)용 QOCI
Qt OCI 플러그인은 사용하는 인스턴트 클라이언트의 버전에 따라 결정되는 오라클 데이터베이스에 대한 연결을 지원합니다. 이는 오라클이 지원하는 것에 따라 달라집니다. 플러그인은 데이터베이스 버전을 자동으로 감지하고 그에 따라 기능을 활성화합니다.
tnsnames.ora 파일 없이도 Oracle 데이터베이스에 연결할 수 있습니다. 이를 위해서는 데이터베이스 SID를 데이터베이스 이름으로 드라이버에 전달하고 호스트 이름을 지정해야 합니다.
OCI 사용자 인증
Qt OCI 플러그인은 외부 자격 증명(OCI_CRED_EXT)을 사용한 인증을 지원합니다. 일반적으로 이는 데이터베이스 서버가 자체 인증 메커니즘 대신 운영 체제에서 제공하는 사용자 인증을 사용한다는 것을 의미합니다.
외부 자격증명 인증을 사용하려면 QSqlDatabase 으로 연결을 열 때 사용자 이름과 비밀번호를 비워 두세요.
OCI BLOB/LOB 지원
이진 대용량 객체(BLOB)를 읽고 쓸 수 있지만 이 과정에서 많은 메모리가 필요할 수 있다는 점에 유의하세요. LOB 필드를 선택하려면 정방향 전용 쿼리를 사용해야 합니다( QSqlQuery::setForwardOnly() 참조).
BLOB을 삽입하려면 BLOB이 자리 표시자에 바인딩된 준비된 쿼리를 사용하거나 내부적으로 준비된 쿼리를 사용하는 QSqlTableModel 을 사용해야 합니다.
연결 옵션
Qt OCI 플러그인은 다음과 같은 연결 옵션을 지원합니다:
속성 | 가능한 값 |
---|---|
OCI_ATTR_PREFETCH_ROWS | OCI 어트리뷰트 OCI_ATTR_PREFETCH_ROWS를 지정된 값으로 설정합니다. |
OCI_ATTR_PREFETCH_MEMORY | OCI 어트리뷰트 OCI_ATTR_PREFETCH_MEMORY를 지정된 값으로 설정합니다. |
OCI_AUTH_MODE | OCI_SYSDBA: SYSDBA 액세스에 대해 인증 OCI_SYSOPER: SYSOPER 액세스에 대해 인증 OCI_DEFAULT: 일반 액세스로 인증 액세스 모드에 대한 자세한 내용은 OCISessionBegin을 참조하십시오. |
Unix 및 macOS에서 OCI 플러그인을 빌드하는 방법
" - 기본" 및 "인스턴트 클라이언트 패키지 - SDK"만 있으면 됩니다.
드라이버를 빌드하는 데 필요한 오라클 라이브러리 파일:
libclntsh.<so|dylib>
(모든 버전)
qt-cmake
에 Oracle 헤더 파일과 공유 라이브러리를 찾을 수 있는 위치를 알려주고 빌드하세요.
인스턴트 클라이언트 패키지 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 인스턴트 클라이언트 패키지를 사용하는 경우, OCI SQL 플러그인을 빌드할 때와 OCI SQL 플러그인을 사용하는 애플리케이션을 실행할 때 LD_LIBRARY_PATH를 설정해야 합니다.
Windows에서 OCI 플러그인을 빌드하는 방법
일반적으로 오라클 클라이언트 설치 CD의 오라클 클라이언트 설치 관리자에서 "프로그래머" 옵션을 선택하면 플러그인을 빌드할 수 있습니다. 일부 버전의 Oracle Client의 경우, 사용 가능한 경우 "통화 인터페이스(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)용 QODBC
ODBC는 공통 인터페이스를 사용하여 여러 DBMS에 연결할 수 있는 일반 인터페이스입니다. QODBC 드라이버를 사용하면 ODBC 드라이버 관리자에 연결하여 사용 가능한 데이터 소스에 액세스할 수 있습니다. 또한 시스템에 설치된 ODBC 드라이버 관리자에 맞는 ODBC 드라이버를 설치 및 구성해야 합니다. 그런 다음 QODBC 플러그인을 사용하면 Qt 애플리케이션에서 이러한 데이터 소스를 사용할 수 있습니다.
참고: 사용 가능한 경우 ODBC 드라이버 대신 기본 드라이버를 사용해야 합니다. 기본 드라이버를 사용할 수 없는 경우 ODBC 지원을 호환 데이터베이스에 대한 대체 수단으로 사용할 수 있습니다.
Windows에서는 ODBC 드라이버 관리자가 기본적으로 설치됩니다. Unix 시스템의 경우 먼저 설치해야 하는 구현이 몇 가지 있습니다. 애플리케이션의 모든 최종 사용자가 ODBC 드라이버 관리자를 설치해야 하며, 그렇지 않으면 QODBC 플러그인이 작동하지 않습니다.
ODBC 데이터 소스에 연결할 때는 실제 데이터베이스 이름이 아니라 QSqlDatabase::setDatabaseName() 함수에 ODBC 데이터 소스(DSN)의 이름을 전달해야 합니다. 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 드라이버로 동작하도록 지시하면 드라이버 플러그인이 예기치 않은 동작을 일으킬 수 있습니다. 이 문제를 방지하려면 setting the connect option "SQL_ATTR_ODBC_VERSION=SQL_OV_ODBC3"
에서 ODBC 드라이버가 3.x 드라이버로 작동하도록 지시하십시오( open your database connection. 이렇게 하면 ODBC 드라이버 동작의 여러 측면(예: SQLSTATE)에 영향을 미칩니다. 이 연결 옵션을 설정하기 전에 예상되는 동작 차이에 대해 ODBC 설명서를 참조하세요.
ODBC 데이터소스에 매우 느리게 액세스하는 경우 ODBC 데이터소스 관리자에서 ODBC 호출 추적이 해제되어 있는지 확인하세요.
일부 드라이버는 스크롤 가능한 커서를 지원하지 않습니다. 이 경우 QSqlQuery::setForwardOnly() 모드의 쿼리만 성공적으로 사용할 수 있습니다.
타임스탬프 지원
ODBC는 시간대 등에 대한 정보가 없는 TIMESTAMP_STRUCT를 사용하고 있습니다. 이로 인해 시간대를 전혀 준수하지 않고 QDateTime 이 사용됩니다.
참고: : 이는 향후 변경될 수 있습니다.
ODBC 저장 프로시저 지원
Microsoft SQL Server에서 반환 문을 사용하거나 여러 결과 집합을 반환하는 저장 프로시저에서 반환되는 결과 집합은 QSqlQuery::setForwardOnly()를 사용하여 쿼리의 전달 전용 모드를 전달로 설정한 경우에만 액세스할 수 있습니다.
// STORED_PROC uses the return statement or returns multiple result sets QSqlQuery query; query.setForwardOnly(true); query.exec("{call STORED_PROC}");
참고: 저장 프로시저의 반환 문에서 반환된 값은 버려집니다.
ODBC 유니코드 지원
유니코드가 정의된 경우 QODBC 플러그인은 유니코드 API를 사용합니다. Windows 기반 시스템에서는 이것이 기본값입니다. ODBC 드라이버와 DBMS도 유니코드를 지원해야 합니다.
Oracle 9 ODBC 드라이버(Windows)의 경우 ODBC 드라이버 관리자에서 "SQL_WCHAR 지원"을 선택해야 합니다. 그렇지 않으면 Oracle이 모든 유니코드 문자열을 로컬 8비트 표현으로 변환합니다.
연결 옵션
Qt ODBC 플러그인은 다음 연결 옵션을 지원합니다:
속성 | 가능한 값 |
---|---|
SQL_ATTR_ACCESS_MODE | SQL_MODE_READ_ONLY: 읽기 전용 모드로 데이터베이스를 엽니다 SQL_MODE_READ_WRITE: 읽기-쓰기 모드로 데이터베이스를 엽니다(기본값). |
SQL_ATTR_로그인_타임아웃 | 로그인 중 데이터베이스 연결을 대기할 시간(초)(값이 0이면 영원히 대기) |
SQL_ATTR_CONNECTION_TIMEOUT | 데이터베이스에 대한 모든 요청을 대기할 시간(초)(값이 0이면 영원히 대기) |
SQL_ATTR_CURRENT_CATALOG | 이 연결에 사용할 카탈로그(데이터베이스) |
SQL_ATTR_METADATA_ID | SQL_TRUE: 카탈로그 함수의 문자열 인수가 식별자로 처리됨 SQL_FALSE: 카탈로그 함수의 문자열 인수가 식별자로 처리되지 않음 |
SQL_ATTR_PACKET_SIZE | 네트워크 패킷 크기를 바이트 단위로 지정합니다. |
SQL_ATTR_TRACEFILE | 추적 파일의 이름을 포함하는 문자열 |
SQL_ATTR_TRACE | SQL_OPT_TRACE_ON: 데이터베이스 쿼리 추적 사용 SQL_OPT_TRACE_OFF: 데이터베이스 쿼리 추적 사용 안 함(기본값) |
SQL_ATTR_커넥션 풀링 | 환경 수준에서 연결 풀링을 사용 또는 사용하지 않도록 설정합니다. SQL_CP_DEFAULT, SQL_CP_OFF: 연결 풀링이 해제됩니다(기본값) SQL_CP_ONE_PER_DRIVER: 각 드라이버에 대해 단일 연결 풀이 지원됩니다 SQL_CP_ONE_PER_HENV: 각 환경에 대해 단일 연결 풀이 지원됩니다. |
SQL_ATTR_ODBC_VERSION | SQL_OV_ODBC3: 드라이버가 ODBC 3.x 드라이버로 작동해야 함 SQL_OV_ODBC2: 드라이버가 ODBC 2.x 드라이버로 작동해야 함(기본값) |
연결 옵션에 대한 자세한 내용은 SQLSetConnectAttr() ODBC 설명서를 참조하세요.
Unix 및 macOS에서 ODBC 플러그인을 빌드하는 방법
unixODBC를 사용하는 것이 좋습니다. 최신 버전 및 ODBC 드라이버는 http://www.unixodbc.org 에서 찾을 수 있습니다. unixODBC 헤더 파일과 공유 라이브러리가 필요합니다.
qt-cmake
에 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 드라이버는 버전 7.3 이상의 PostgreSQL 서버를 지원합니다.
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 정방향 전용 쿼리 지원
정방향 전용 쿼리를 사용하려면 PostreSQL 클라이언트 라이브러리 버전 9.2 이상으로 QPSQL 플러그인을 빌드해야 합니다. 이전 버전으로 플러그인을 빌드한 경우 정방향 전용 모드를 사용할 수 없으며 QSqlQuery::setForwardOnly()를 true
으로 호출해도 아무런 효과가 없습니다.
경고: 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 }
쿼리1과 쿼리2가 서로 다른 데이터베이스 연결을 사용하거나 while 루프 뒤에 쿼리2를 실행하는 경우에는 이 문제가 발생하지 않습니다.
참고: 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_MODE | SQL_MODE_READ_ONLY: 읽기 전용 모드로 데이터베이스를 엽니다 SQL_MODE_READ_WRITE: 읽기-쓰기 모드로 데이터베이스를 엽니다(기본값). |
SQL_ATTR_로그인_타임아웃 | 로그인 중 데이터베이스 연결을 대기할 시간(초)(최대: 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_INCLUDE_DIR="/usr/local/db2/include" -DDB2_LIBRARY="/usr/local/db2/lib/libdb2.<so|dylib>" cmake --build . cmake --install .
Windows에서 QDB2 플러그인을 빌드하는 방법
DB2 헤더와 include 파일이 올바른 디렉터리에 이미 설치되어 있어야 합니다. 다음과 같이 플러그인을 빌드하기만 하면 됩니다:
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_INCLUDE_DIR="C:\db2\include" -DDB2_LIBRARY="C:\db2\lib\db2.lib" cmake --build . cmake --install .
SQLite용 QSQLITE(버전 3 이상)
Qt SQLite 플러그인을 사용하면 SQLite 데이터베이스에 액세스할 수 있습니다. SQLite는 처리 중 데이터베이스이므로 데이터베이스 서버가 필요하지 않습니다. SQLite는 단일 파일에서 작동하며, 연결을 열 때 데이터베이스 이름으로 설정해야 합니다. 파일이 존재하지 않으면 SQLite가 파일을 생성하려고 시도합니다. SQLite는 인메모리 및 임시 데이터베이스도 지원합니다. 데이터베이스 이름으로 각각 ":memory:" 또는 빈 문자열을 전달하기만 하면 됩니다.
SQLite에는 여러 사용자 및 여러 트랜잭션과 관련된 몇 가지 제한 사항이 있습니다. 서로 다른 트랜잭션에서 리소스를 읽거나 쓰려고 하면 한 트랜잭션이 커밋되거나 롤백될 때까지 애플리케이션이 멈출 수 있습니다. Qt SQLite 드라이버는 시간 초과가 발생할 때까지 잠긴 리소스에 대한 쓰기를 다시 시도합니다( QSqlDatabase::setConnectOptions()에서 QSQLITE_BUSY_TIMEOUT
참조).
SQLite에서는 INTEGER 기본 키 열을 제외한 모든 열을 사용하여 모든 유형의 값을 저장할 수 있습니다. 예를 들어, INTEGER로 선언된 열은 한 행에는 정수 값을, 다음 행에는 텍스트 값을 포함할 수 있습니다. 이는 SQLite가 값의 유형을 값이 저장된 열이 아닌 값 자체와 연관시키기 때문입니다. 그 결과 QSqlField::type()이 반환하는 유형은 필드의 권장 유형만 나타냅니다. 이를 통해 실제 유형을 가정해서는 안 되며 개별 값의 유형을 확인해야 합니다.
선택이 실행되는 동안 드라이버는 업데이트를 위해 잠겨 있습니다. Qt의 항목 보기는 필요에 따라 데이터를 가져오기 때문에 QSqlTableModel 을 사용할 때 문제가 발생할 수 있습니다( QSqlTableModel 의 경우 QSqlQuery::fetchMore() 사용).
SQLite에 대한 정보는 http://www.sqlite.org 에서 확인할 수 있습니다.
타임스탬프 지원
SQLite에는 특별한 타임스탬프 열 유형이 없습니다. QDateTime 은 Qt::ISODateWithMs 형식의 문자열로 저장되므로 삽입 및 선택 시 QDateTime 시간대 정보가 보존됩니다.
연결 옵션
Qt SQLite 플러그인은 다음 연결 옵션을 지원합니다:
속성 | 가능한 값 |
---|---|
qsqlite_busy_timeout | 밀리초 단위의 바쁜 핸들러 시간 초과(값 <= 0: 비활성화), 자세한 내용은 SQLite 설명서를 참조하십시오. |
QSQLITE_USE_QT_VFS | 이 옵션이 설정되면, 데이터베이스는 QFile 를 사용하여 데이터베이스를 열 수 있는 Qt의 VFS 를 사용하여 열립니다. 이렇게 하면 모든 읽기-쓰기 위치(예: 안드로이드 공유 저장소)에서 데이터베이스를 열 수 있을 뿐만 아니라 읽기 전용 리소스(예: qrc 또는 안드로이드 에셋)에서도 데이터베이스를 열 수 있습니다. 읽기 전용 리소스에서 데이터베이스를 열 때는 QSQLITE_OPEN_READONLY 속성도 추가해야 한다는 점에 유의하세요. 그렇지 않으면 열리지 않습니다. |
QSQLITE_OPEN_READONLY | 설정하면 데이터베이스가 읽기 전용 모드로 열리며 데이터베이스가 존재하지 않으면 실패합니다. 그렇지 않으면 데이터베이스가 읽기-쓰기 모드로 열리고 데이터베이스 파일이 아직 존재하지 않는 경우 데이터베이스가 생성됩니다(기본값). |
QSQLITE_OPEN_URI | 주어진 파일명을 URI로 해석합니다( SQLITE_OPEN_URI 참조). |
qsqlite_enable_shared_cache | 설정하면 데이터베이스가 공유 캐시 모드로 열리고, 그렇지 않으면 개인 캐시 모드로 열립니다. |
QSQLITE_ENABLE_REGEXP | 설정하면 플러그인은 쿼리에 사용할 수 있는 함수 '정규식'을 정의하며, QRegularExpression 은 정규식 쿼리 평가에 사용됩니다. |
qsqlite_no_use_extended_result_codes | SQLite에서 확장 결과 코드 기능의 사용을 비활성화합니다. |
QSQLITE_ENABLE_NON_ASCII_CASE_FOLDING | 설정하면 플러그인이 '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 연산자와 함께 제공됩니다. 그러나 필요한 구현은 사용자가 제공해야 합니다. 편의를 위해 기본 구현은 the database connection is opened 이전에 setting the connect option QSQLITE_ENABLE_REGEXP
으로 활성화할 수 있습니다. 그러면 "열 REGEXP '패턴'"과 같은 SQL 문은 기본적으로 Qt SQL 코드
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은 유니코드를 완벽하게 지원합니다. 유니코드 데이터로 작업하려면 열 유형 국가 문자(NCHAR), 국가 문자 가변(NVARCHAR) 또는 국가 문자 큰 객체(NCLOB)를 사용해야 합니다. 모방 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 .
볼랜드 인터베이스용 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
에 있어야 합니다.
문제 해결
항상 프로젝트에 사용하는 컴파일러와 동일한 컴파일러로 컴파일된 클라이언트 라이브러리를 사용해야 합니다. 클라이언트 라이브러리를 직접 컴파일할 소스 배포를 받을 수 없는 경우 미리 컴파일된 라이브러리가 컴파일러와 호환되는지 확인해야 하며, 그렇지 않으면 "정의되지 않은 기호" 오류가 많이 발생합니다.
플러그인 컴파일에는 성공했지만 나중에 로드할 수 없는 경우 다음 단계를 확인하여 원인을 찾아보세요:
- 플러그인이 올바른 디렉터리에 있는지 확인합니다. QApplication::libraryPaths()를 사용하여 Qt가 플러그인을 찾는 위치를 확인할 수 있습니다.
- 시스템에서 DBMS의 클라이언트 라이브러리를 사용할 수 있는지 확인합니다. 유닉스에서는
ldd
명령을 실행하고 플러그인 이름(예:ldd libqsqlmysql.so
)을 파라미터로 전달합니다. 클라이언트 라이브러리를 찾을 수 없는 경우 경고가 표시됩니다. Windows에서는 Visual Studio의 종속성 워커 또는 종속성 GUI를 사용하여 종속 라이브러리를 찾을 수 있습니다. Qt Creator 을 사용하여 프로젝트 패널의 실행 섹션에서PATH
환경 변수를 업데이트하여 클라이언트 라이브러리가 포함된 폴더의 경로를 포함할 수 있습니다. - MSVC를 사용하는 경우 플러그인이 올바른 빌드 유형으로 빌드되었는지 확인하세요. 디버그와 릴리스용 MSVC 런타임이 다르기 때문에 Qt 디버그 빌드에서는 Qt 릴리스 플러그인을 로드할 수 없으며, 그 반대의 경우도 마찬가지입니다.
- 플러그인을 로드할 때 매우 자세한 디버그 출력을 얻으려면 컴파일된 Qt 실행 파일을 환경 변수 QT_DEBUG_PLUGINS로 설정하여 실행하십시오.
- 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); } };
© 2025 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.