반응형
Linux에 아직 TimescaleDB를 설치하지 않았다면 아래의 글을 참고한다.
https://namsaenga.tistory.com/27
<1. libpqxx 라이브러리 설치하기>
PostgreSQL에서 사용했던 C++ 라이브러리를 TimescaleDB를 위해 사용할 수 있는데, 이는 TimescaleDB가 PostgreSQL과 동일한 방식으로 DB 인스턴스에 연결하고 상호작용하기 때문이다.
클라이언트에서 MFC를 이용한 Windows 응용 프로그래밍을 위하여 C++ 라이브러리인 libpqxx를 사용할 것이기 때문에, 서버에서도 마찬가지로 개발의 편의성을 위하여 같은 라이브러리인 libpqxx를 사용했다.
[방법 1] 프로젝트를 직접 다운로드하여 CMake 작업하기
https://github.com/jtv/libpqxx
방법: 자신의 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 제약조건을 꼭 추가한다.
반응형
'프로그래밍 > TimescaleDB | PostgreSQL' 카테고리의 다른 글
Linux에서 TimescaleDB(PostgreSQL)를 외부로 오픈할 때 필요한 명령어 (0) | 2022.03.25 |
---|---|
TimescaleDB에 구조체 삽입 후 조회(2) (0) | 2022.03.23 |
TimescaleDB에 구조체 삽입 후 조회(1) (0) | 2022.03.22 |
Linux에 TimescaleDB 설치하기 (0) | 2022.03.14 |
댓글