본문 바로가기
프로그래밍/TimescaleDB | PostgreSQL

Server-side에서 TimescaleDB libpqxx 라이브러리 설치 및 사용하기

by 남생 namsaeng 2022. 3. 21.
반응형

Linux에 아직 TimescaleDB를 설치하지 않았다면 아래의 글을 참고한다.

https://namsaenga.tistory.com/27

 

Linux에 TimescaleDB 설치하기

TimescaleDB는 시계열 데이터 타입을 처리할 수 있는 오픈소스 데이터베이스 관리 시스템이다. BSD 계열인 Apache License 2.0이기 때문에, 이 데이터베이스를 사용하는 애플리케이션은 소스코드의 공개

namsaenga.tistory.com

 


<1. libpqxx 라이브러리 설치하기>

 

PostgreSQL에서 사용했던 C++ 라이브러리를 TimescaleDB를 위해 사용할 수 있는데, 이는 TimescaleDB가 PostgreSQL과 동일한 방식으로 DB 인스턴스에 연결하고 상호작용하기 때문이다.

 

클라이언트에서 MFC를 이용한 Windows 응용 프로그래밍을 위하여 C++ 라이브러리인 libpqxx를 사용할 것이기 때문에, 서버에서도 마찬가지로 개발의 편의성을 위하여 같은 라이브러리인 libpqxx를 사용했다.

 

[방법 1] 프로젝트를 직접 다운로드하여 CMake 작업하기

 

https://github.com/jtv/libpqxx

 

GitHub - jtv/libpqxx: The official C++ client API for PostgreSQL.

The official C++ client API for PostgreSQL. Contribute to jtv/libpqxx development by creating an account on GitHub.

github.com

 

방법: 자신의 PC에서 지원 가능한 C++ 컴파일러 버전을 확인하고 libpqxx 라이브러리 릴리즈마다 최소 요구 C++ 컴파일러를 확인하여, 적당한 라이브러리를 다운로드한다.

 

  • 첫 번째, Red Hat Enterprise Linux에서 지원 가능한 C++ 컴파일러 확인하기
    - Red Hat 공식문서를 보면 리눅스 릴리즈 8.5 버전은 C++17 및 C++20을 지원, 추가로 C++23 초안 기능 중 일부를 실험적으로 지원한다.

 

$ g++ --version
g++ (GCC) 8.5.0 20210514 (Red Hat 8.5.0-4)

 

 

  •  두 번째, 최근 라이브러리의 최소 요구 C++ 컴파일러 버전 확인하기
    - libpqxx 7.7.0은 최소 요구 C++ 컴파일러 버전이 C++17이다.

 

  • 세 번째, 해당 라이브러리를 원하는 경로로 다운로드하고 압축을 푼 다음에 프로젝트 디렉터리를 연다.

 

  • 마지막, 프로젝트 디렉터리 최상위 경로에서 다음 명령을 실행한다.
    - 구글에 검색을 해봤지만 오류를 해결할 마땅한 방안을 찾을 수 없었다.

 

$ mkdir build
$ cd build
$ cmake ..
CMake Error at /usr/local/share/cmake-3.21/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
Could NOT find PostgreSQL (missing: PostgreSQL_LIBRARY
PostgreSQL_INCLUDE_DIR)
Call Stack (most recent call first):
/usr/local/share/cmake-3.21/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)
/usr/local/share/cmake-3.21/Modules/FindPostgreSQL.cmake:269 (find_package_handle_standard_args)
cmake/config.cmake:26 (find_package)
CMakeLists.txt:27 (include)

 

 

 


 

[방법 2] dnf를 이용하여 설치하기

 

 

$ sudo yum makecache
$ sudo yum –y install libpqxx
$ sudo dnf install libpqxx
$ sudo dnf install libpqxx-devel

 

 

  • libpqxx-devel까지 설치하고 나면 /usr/include/pqxx 경로에 최신 라이브러리 파일 및 /usr/include/pqxx/pqxx 파일이 생성된 것을 확인할 수 있다.

 

 


 

<2. libpqxx 라이브러리 사용하기>

 

[절차 1] TimescaleDB 예제 테이블 생성 및 데이터 삽입

 

a) lipqxxTest1.cpp 소스코드

 

#include <iostream>
#include <string>
#include <random>
#include <pqxx/pqxx>
using namespace std;
static int DoCreateAndInsert() {
  string sql, sql2;
  pqxx::connection conn{"postgres://postgres:1234@127.0.0.1:5432/example"};
  pqxx::work work{conn};
  sql = "create table test1(" \
  "id   timestamp not null, " \
  "name character varying, " \
  "age  int);";
  sql2 = "select create_hypertable('test1', 'id')";
  work.exec(sql);
  work.exec(sql2);
  work.commit();
  conn.prepare("test", "insert into test1(id, name, age) values($1, $2, $3)");
 
  work.exec_prepared("test", "now()", "nam" , 10);
  work.commit();
  return 0;
}
int main() {
  return DoCreateAndInsert();
}

 

b) Red Hat Enterprise Linux Terminal

 

[namsaenga@localhost postgresql_examples]$ g++ lipqxxTest1.cpp -std=c++17 -o lipqxxTest1 -lpqxx
[namsaenga@localhost postgresql_examples]$ ./lipqxxTest1

 

 

c) TimescaleDB Client

 

[namsaenga@localhost postgresql_examples]$ psql -U postgres -h localhost
Password for user postgres:
psql (14.2)
Type "help" for help.
postgres=# \c example
You are now connected to database "example" as user "postgres".
example=# \dt+ test1;
List of relations
Schema | Name | Type | Owner | Persistence | Access method | Size | Des
cription
--------+-------+-------+----------+-------------+---------------+------------+----
---------
public | test1 | table | postgres | permanent | heap | 8192 bytes |
(1 row)
example=# select * from test1;
id | name | age
----------------------------+------+-----
2022-03-21 11:07:41.606006 | nam | 10
(1 row)

 

 


[절차 2] TimescaleDB 예제 테이블 데이터 조회

 

a) lipqxTest2.cpp 소스코드

 

#include <iostream>
#include <string>
#include <random>
#include <pqxx/pqxx>
using namespace std;
static int DoSelect() {
  string sql, sql2;
  pqxx::connection conn{"postgres://postgres:1234@127.0.0.1:5432/example"};
  sql = "select * from test1;";
  pqxx::nontransaction nontran(conn);
  pqxx::result _result(nontran.exec(sql));
  
  for(pqxx::result::const_iterator c_iter = _result.begin(); c_iter != _result.end(); c_iter++){
    cout << "id = " << c_iter[0].as<string>() << endl;
    cout << "name = " << c_iter[1].as<string>() << endl;
    cout << "age = " << c_iter[2].as<int>() << endl;
  }
  return 0;
}
int main() {
  return DoSelect();
}

 

b) Red Hat Enterprise Linux Terminal

 

 

[namsaenga@localhost postgresql_examples]$ g++ lipqxxTest2.cpp -std=c++17 -o lipqxxTest2 -lpqxx
[victek@localhost postgresql_examples]$ ./lipqxxTest2
id = 2022-03-21 11:07:41.606006
name = nam
age = 10

 

 


 

“시계열 테이블로 만들기 위하여 create_hypertable 사용 시에 발생할 수 있는 문제”

 

 

구분 필드명 자료형 현상
실패 name character varying example=# select create_hypertable('test1', 'name');
오류: invalid type for dimension "name"
HINT: Use an integer, timestamp, or date type.
실패 id int example=# select create_hypertable('test1', 'id');
오류: integer dimensions require an explicit interval
실패 id timestamp example=# select create_hypertable('test1', 'id');
알림: adding not-null constraint to column "id"
DETAIL: Time dimensions cannot have NULL values.
create_hypertable
--------------------
(3,public,test1,t)
(1 row)
성공 id timestamp not null example=# select create_hypertable('test1', 'id');
create_hypertable
--------------------
(4,public,test1,t)
(1 row)

 

  • 시계열 테이블로 사용하기 위해서는 기준이 되는 필드의 타입을 TIMESTAMP 또는 DATE로 하고, NOT NULL 제약조건을 꼭 추가한다.

 

libpqxx_github

 

 

 

 

 

반응형

댓글