Interface(C++) 개요
Interface(C++) 이란?
postSQL은 C/C++를 이용하여 인터페이스를 구축할 수 있습니다.
C++을 사용하여 postgreSQL과 상호작용하려면 libpqxx 라는 라이브러리를 사용해야 합니다.
– PostgreSQL 공식 문서 –
설치 요구사항
선행 라이브러리 / 패키지 | OS | 버전 | 비고 |
---|---|---|---|
postgresql14-devel | Linux | 14.2(pg 버전과 동일) | postgresql 개발도구 패키지 |
g++ | Linux | 4.8.5 20150623 (RedHat 4.8.5-44) | 컴파일러 (Centos 7 에서 지원하는 높은 버전 ) |
선행 라이브러리 / 패키지 | OS | 버전 | 비고 |
---|---|---|---|
libpqxx | Linux | 7.8.0(latest), | |
7.7.5(stable), | |||
4.0.1 | PostgreSQL 드라이버 | ||
CentOS 7 한정 4.0.1이 최신버전libpqxx 개발 도구 제공 | |||
libpqxx와 일치하는 버전으로 사용 | |||
libpqxx-devel | Linux | 7.7.5(latest), | |
4.0.1 | 컴파일러 (Centos 7 에서 지원하는 높은 버전 ) |
libpqxx의 지원 범위
libpqxx | C++ | g++ |
---|---|---|
4.x | 14 | 4.8 ~ 4.9 |
7.x | 17 | 6.1 ~ |
libpqxx의 가장 최신 버전은 23년도 6월 기준 7.8.0 이며 stable은 7.7.5 버전입니다.
https://libpqxx.readthedocs.io/en/latest/
https://libpqxx.readthedocs.io/en/stable/
Connect 시놉시스
libpqxx를 이용해 postgresql에 접속
- connection 객체를 생성하고 접속정보를 입력한 뒤 disconnect() 메소드를 호출하여 연결을 닫습니다.
pqxx::connection conn(dbname= user= password= host= port=);
…
conn.disconnect();
Select 시놉시스
std::string selectQuery1 = “SELECT * FROM test”;
pqxx::work txnSelect(conn);
pqxx::result result = txnSelect.exec(selectQuery1);for (auto row : result) { std::cout << "col1: " << row["col1"].c_str() << … << std::endl; }
txnSelect.commit();
Insert 시놉시스
Select 시놉시스
std::string insertQuery = “INSERT INTO test (col1, col2, col3) VALUES (‘value1’, ‘value2’, ‘value3’)”;
pqxx::work txnInsert(conn);
txnInsert.exec(insertQuery);
txnInsert.commit();
Update 시놉시스
std::string updateQuery = “UPDATE test SET col1 = ‘updated_value’ WHERE col2 = ‘value2′”;
pqxx::work txnUpdate(conn);
txnUpdate.exec(updateQuery);
txnUpdate.commit();
소스코드
- CRUD 소스코드 예시
#include <iostream>
#include <pqxx/pqxx>using namespace std;
using namespace pqxx;int main() {
try {
std::string connString = “dbname=postgres user=postgres password=postgres hostaddr=192.168.137.51 port=5432”;pqxx::connection conn(connString); std::string insertQuery = "INSERT INTO test (col1, col2, col3) VALUES ('value1', 'value2', 'value3')"; pqxx::work txnInsert(conn); txnInsert.exec(insertQuery); txnInsert.commit(); std::cout << "Data inserted successfully." << std::endl; std::string selectQuery1 = "SELECT * FROM test"; pqxx::work txnSelect1(conn); pqxx::result result1 = txnSelect1.exec(selectQuery1); std::cout << "Reading data from the test table:" << std::endl; for (auto row : result1) { std::cout << "col1: " << row["col1"].c_str() << ", col2: " << row["col2"].c_str() << ", col3: " << row["col3"].c_str() << std::endl; } txnSelect1.commit();
std::string updateQuery = “UPDATE test SET col1 = ‘updated_value’ WHERE col2 = ‘value2′”;
pqxx::work txnUpdate(conn);
txnUpdate.exec(updateQuery);
txnUpdate.commit();
std::cout << “Data updated successfully.” << std::endl;std::string selectQuery2 = "SELECT * FROM test"; pqxx::work txnSelect2(conn); pqxx::result result2 = txnSelect2.exec(selectQuery2); std::cout << "Reading data from the test table:" << std::endl; for (auto row : result2) { std::cout << "col1: " << row["col1"].c_str() << ", col2: " << row["col2"].c_str() << ", col3: " << row["col3"].c_str() << std::endl; } txnSelect2.commit(); std::string deleteQuery = "DELETE FROM test"; pqxx::work txnDelete(conn); txnDelete.exec(deleteQuery); txnDelete.commit(); std::cout << "Data deleted successfully." << std::endl;
std::string selectQuery3 = “SELECT * FROM test”;
pqxx::work txnSelect3(conn);
pqxx::result result3 = txnSelect3.exec(selectQuery3);
std::cout << “Reading data from the test table:” << std::endl;
for (auto row : result3) {
std::cout << “col1: ” << row[“col1”].c_str() << “, col2: ” << row[“col2”].c_str() << “, col3: ” << row[“col3”].c_str() << std::endl;
}
txnSelect3.commit();conn.disconnect();
} catch (const std::exception &e) {
std::cerr << “Error: ” << e.what() << std::endl;
}return 0;
}
C++ 활용 실습
- Windows 활용 실습
- visual studio 를 실행하여 파일 > 새로만들기 > 프로젝트를 클릭
- 빈 프로젝트 클릭 후 프로젝트 이름 : cpp_test, 위치 : C:interfacecpp 로 생성

우측의 솔루션 탐색기에서 소스파일 우클릭 > 추가 > 새 항목 클릭 C++ 파일 선택하고, 이름에 testlibpqxx.cpp로 지정하고 추가

testlibpqxx.cpp에 제공받은 C++ 소스 파일의 내용을 붙여넣기 하거나 기존 항목을 이용해 추가

window용 libpqxx를 세팅. 실습에서는 microsoft에서 제공하는 C,C++ 라이브러리 관리 툴인 vcpkg를 이용하여 libpqxx를 세팅
vcpkg의 선행 조건은 다음과 같다
- vcpkg의 선행 조건은 다음과 같다
선행조건 | 버전 | 비고 |
---|---|---|
windows OS | 7 or newer | 7 이상 사용가능 |
Git | – | git 접속 or git clone 사용하여 레포지토리 다운 가능하여야함 |
Visual Studio | 2015 update 3 or newer | 2015 update 3 이후 |
vcpkg를 git에서 다운. 해당 URL의 최신 버전의 소스 코드 (zip)를 다운
https://github.com/microsoft/vcpkg/releases
//작성일 기준 2023.06.20이 최신버전이라 이 버전으로 다운받아 진행합니다.
C:Program Filesvcpkg 경로를 생성하여 이곳에 압축을 풉니다. 그 후 bootstrap-vcpkg.bat 파일을 명령 프롬프트 창에서 실행합니다.

실행 후 bat 파일과 같은 경로에 생성된 vcpkg.exe 파일을 확인하고 이를 시스템 환경 변수에 등록

vcpkg를 이용해 x64-windows 용 libpqxx와 의존성 패키지들을 같이 다운 & 라이브러리 컴파일
vcpkg install libpqxx:x64-windows

작업 완료 후 생성된 라이브러리들을 해당 경로에서 확인
C:Program Filesvcpkginstalledx64-windowsbin

C:Program Filesvcpkginstalledx64-windowslib

다음 파일들을 C:interfaceCPPlibpqxx 디렉토리를 생성하고 visual studio에서 참조하기 쉽게 옮겨놓습니다.
C:Program Filesvcpkginstalledx64-windowsinclude 폴더 전체
pqxx.lib

- visual studio로 돌아가서 우측 솔루션 탐색기에서 cpp_test 프로젝트 우클릭하여 속성에서 다음과 같이 설정합니다.
- C/C++ > 일반에서 추가 포함 디렉터리에서 콤보박스를 눌러 편집에서 방금 생성한 경로와 include 경로를 입력합니다.

링커 > 일반에서 추가 라이브러리 디렉터리를 편집하여 pqxx.lib 폴더가 있는 디렉터리를 입력

링커 > 입력에서 추가 종속성을 편집하여 pgxx.lib을 입력합니다.

C++ 17 표준을 사용한 샘플 코드이기 때문에 일반 > C++ 언어 표준을 변경합니다

빌드 탭에서 솔루션 정리 후 빌드를 합니다

- 프로젝트경로x64Debug 경로에 cpp_test.exe와 cpp_test.pdb가 생성됨을 확인합니다.
- C:Program Filesvcpkginstalledx64-windowsbin 경로의 다음 dll 파일들을 모두 이 경로에 복사합니다.

명령 프롬프트 창을 실행하여, 프로젝트경로x64Debug 경로로 이동 한 다음, cpp_test.exe를 실행하여 결과를 확인합니다.

- Linux 활용 실습
선행 패키지인 postgresql-devel을 설치
#yum install centos-release-scl-rh
#yum install llvm-toolset-7-clang
#yum install postgresql14-devel-14.2*
설치 후 선행 패키지인 g++도 설치
yum install gcc-c++
libpqxx 4.0.1 버전을 설치
libpqxx-devel 4.0.1 버전을 설치
# yum install libpqxx-4.0.1
# yum install libpqxx-devel-4.0.1
pgtest.cpp 파일을 업로드
$ su – opensql
$ mkdir ./interface/libpqxx
$ cd /opensql/interface/libpqxx
pgtest.cpp를 컴파일합니다. posgresql 바이너리의 include, lib 디렉토리 경로를 명시하고 -std=c++11 옵션을 추가하여 c++11 포맷을 인식하도록 합니다.
$ g++ pgtest.cpp -std=c++11 -I/usr/pgsql-14/include -I/usr/pgsql-14/include/internal -L/usr/pgsql-14/lib -lpqxx -lpq

수행 결과를 확인합니다
$ ./a.out
Data inserted successfully.
Reading data from the test table:
col1: value1, col2: value2, col3: value3
Data updated successfully.
Reading data from the test table:
col1: updated_value, col2: value2, col3: value3
Data deleted successfully.
Reading data from the test table:
지금까지 PostgreSQL의 Interface(C++)에 관해 알아보았습니다
‘PostgreSQL의 (Interface) .NET – Npgsql을 바로 이어서 확인해보세요!