About
home
Tmax OpenSQL
home
💻

49. Interface(C++)

작성자
KMS

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/

Connect 시놉시스

libpqxx를 이용해 postgresql에 접속
connection 객체를 생성하고 접속정보를 입력한 뒤 disconnect() 메소드를 호출하여 연결을 닫습니다.
pqxx::connection conn(dbname= user= password= host= port=); … conn.disconnect();
JavaScript
복사

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();
JavaScript
복사

Insert 시놉시스

Select 시놉시스

std::string insertQuery = "INSERT INTO test (col1, col2, col3) VALUES ('value1', 'value2', 'value3')"; pqxx::work txnInsert(conn); txnInsert.exec(insertQuery); txnInsert.commit();
JavaScript
복사

Update 시놉시스

std::string updateQuery = "UPDATE test SET col1 = 'updated_value' WHERE col2 = 'value2'"; pqxx::work txnUpdate(conn); txnUpdate.exec(updateQuery); txnUpdate.commit();
JavaScript
복사

소스코드

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; }
JavaScript
복사

C++ 활용 실습

Windows 활용 실습
visual studio 를 실행하여 파일 > 새로만들기 > 프로젝트를 클릭
빈 프로젝트 클릭 후 프로젝트 이름 : cpp_test, 위치 : C:\interface\cpp 로 생성
우측의 솔루션 탐색기에서 소스파일 우클릭 > 추가 > 새 항목 클릭 C++ 파일 선택하고, 이름에 testlibpqxx.cpp로 지정하고 추가
testlibpqxx.cpp에 제공받은 C++ 소스 파일의 내용을 붙여넣기 하거나 기존 항목을 이용해 추가
window용 libpqxx를 세팅. 실습에서는 microsoft에서 제공하는 C,C++ 라이브러리 관리 툴인 vcpkg를 이용하여 libpqxx를 세팅
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이 최신버전이라 이 버전으로 다운받아 진행합니다.
JavaScript
복사
C:\Program Files\vcpkg 경로를 생성하여 이곳에 압축을 풉니다. 그 후 bootstrap-vcpkg.bat 파일을 명령 프롬프트 창에서 실행합니다.
실행 후 bat 파일과 같은 경로에 생성된 vcpkg.exe 파일을 확인하고 이를 시스템 환경 변수에 등록
vcpkg를 이용해 x64-windows 용 libpqxx와 의존성 패키지들을 같이 다운 & 라이브러리 컴파일
vcpkg install libpqxx:x64-windows
JavaScript
복사
작업 완료 후 생성된 라이브러리들을 해당 경로에서 확인
C:\Program Files\vcpkg\installed\x64-windows\bin
JavaScript
복사
C:\Program Files\vcpkg\installed\x64-windows\lib
JavaScript
복사
다음 파일들을 C:\interface\CPP\libpqxx 디렉토리를 생성하고 visual studio에서 참조하기 쉽게 옮겨놓습니다.
C:\Program Files\vcpkg\installed\x64-windows\include 폴더 전체 pqxx.lib
JavaScript
복사
visual studio로 돌아가서 우측 솔루션 탐색기에서 cpp_test 프로젝트 우클릭하여 속성에서 다음과 같이 설정합니다.
C/C++ > 일반에서 추가 포함 디렉터리에서 콤보박스를 눌러 편집에서 방금 생성한 경로와 include 경로를 입력합니다.
링커 > 일반에서 추가 라이브러리 디렉터리를 편집하여 pqxx.lib 폴더가 있는 디렉터리를 입력
링커 > 입력에서 추가 종속성을 편집하여 pgxx.lib을 입력합니다.
C++ 17 표준을 사용한 샘플 코드이기 때문에 일반 > C++ 언어 표준을 변경합니다
빌드 탭에서 솔루션 정리 후 빌드를 합니다
프로젝트경로\x64\Debug 경로에 cpp_test.exe와 cpp_test.pdb가 생성됨을 확인합니다.
C:\Program Files\vcpkg\installed\x64-windows\bin 경로의 다음 dll 파일들을 모두 이 경로에 복사합니다.
명령 프롬프트 창을 실행하여, 프로젝트경로\x64\Debug 경로로 이동 한 다음, cpp_test.exe를 실행하여 결과를 확인합니다.
Linux 활용 실습
선행 패키지인 postgresql-devel을 설치
# yum install centos-release-scl-rh # yum install llvm-toolset-7-clang # yum install postgresql14-devel-14.2*
JavaScript
복사
설치 후 선행 패키지인 g++도 설치
# yum install gcc-c++
JavaScript
복사
libpqxx 4.0.1 버전을 설치
libpqxx-devel 4.0.1 버전을 설치
# yum install libpqxx-4.0.1 # yum install libpqxx-devel-4.0.1
JavaScript
복사
pgtest.cpp 파일을 업로드
$ su - opensql $ mkdir ./interface/libpqxx $ cd /opensql/interface/libpqxx
JavaScript
복사
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
JavaScript
복사
수행 결과를 확인합니다
$ ./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:
JavaScript
복사
지금까지 PostgreSQL의 Interface(C++)에 관해 알아보았습니다
PostgreSQL의 (Interface) .NET - Npgsql을 바로 이어서 확인해보세요!

자유롭게 댓글을 남겨주세요