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을 바로 이어서 확인해보세요!