PostgreSQL 데이터베이스 엔진

PostgreSQL 데이터베이스 엔진

원격 PostgreSQL 서버의 데이터베이스에 연결할 수 있게 해주는 데이터베이스 엔진이에요. ClickHouse와 PostgreSQL 사이 데이터를 교환하는 읽기·쓰기 연산(SELECTINSERT 쿼리)을 지원해요.

출처: 문서

본문

원격 PostgreSQL 서버의 데이터베이스에 연결할 수 있게 해줘요. ClickHouse와 PostgreSQL 사이 데이터를 교환하는 읽기·쓰기 연산(SELECTINSERT 쿼리)을 지원해요. SHOW TABLESDESCRIBE TABLE 쿼리로 원격 PostgreSQL의 테이블 목록과 구조에 실시간 접근을 제공해요. 테이블 구조 수정(ALTER TABLE ... ADD|DROP COLUMN)을 지원해요. use_table_cache 매개변수(아래 엔진 매개변수 참고)가 1로 설정되면 테이블 구조가 캐시되어 수정 여부가 검사되지 않지만, DETACHATTACH 쿼리로 업데이트할 수 있어요.

데이터베이스 만들기 (Creating a database)

CREATE DATABASE test_database
ENGINE = PostgreSQL('host:port', 'database', 'user', 'password'[, `schema`, `use_table_cache`]);

엔진 매개변수 (Engine Parameters)

  • host:port — PostgreSQL 서버 주소.
  • database — 원격 데이터베이스 이름.
  • user — PostgreSQL 사용자.
  • password — 사용자 비밀번호.
  • schema — PostgreSQL 스키마.
  • use_table_cache — 데이터베이스 테이블 구조가 캐시되는지 여부를 정의해요. 선택 사항. 기본값: 0.

TLS/SSL 매개변수는 libpq로 전달되며 명명된 컬렉션(named collection) 또는 뒤따라오는 키-값 인자로 제공할 수 있어요. sslmode(disable, allow, prefer, require, verify-ca 또는 verify-full), 그리고 두 가지 형태의 인증서·키가 있어요. sslrootcert(CA 인증서), sslcert(클라이언트 인증서), sslkey(클라이언트 개인 키)는 서버 로컬 파일 경로이며, 서버 설정 파일에 정의된 명명된 컬렉션에서만 받아들여져요. sslrootcert_pem, sslcert_pem, sslkey_pem은 대신 해당 파일의 리터럴 내용을 받아들이고, SQL에서 지정할 수 있으며(예: ENGINE = PostgreSQL('host:port', 'database', 'user', 'password', sslmode = 'verify-full', sslrootcert_pem = '...')), 비밀번호처럼 로그와 SHOW 쿼리에서 마스킹돼요. 설정하지 않으면 libpq 기본값이 적용돼요(sslmode=prefer).

데이터 타입 지원 (Data types support)

PostgreSQL ClickHouse
DATE Date
TIMESTAMP DateTime
REAL Float32
DOUBLE Float64
DECIMAL, NUMERIC Decimal (아래 주석 참고)
SMALLINT Int16
INTEGER Int32
BIGINT Int64
SERIAL UInt32
BIGSERIAL UInt64
TEXT, CHAR String
INTEGER Nullable(Int32)
ARRAY Array

Decimal256가 지원하는 최대값인 76보다 큰 정밀도 p의 PostgreSQL numeric(p, 0) — 예를 들어 256비트 정수를 저장하는 데 흔히 쓰는 numeric(78, 0) — 은 Decimal 대신 Int256으로 매핑돼요. Int256 범위에 맞지 않는 값은 오류로 거부돼요.

사용 예시 (Examples of use)

PostgreSQL 서버와 데이터를 교환하는 ClickHouse의 데이터베이스:

CREATE DATABASE test_database
ENGINE = PostgreSQL('postgres1:5432', 'test_database', 'postgres', 'mysecretpassword', 'schema_name',1);
SHOW DATABASES;
┌─name──────────┐
│ default       │
│ test_database │
│ system        │
└───────────────┘
SHOW TABLES FROM test_database;
┌─name───────┐
│ test_table │
└────────────┘

PostgreSQL 테이블에서 데이터 읽기:

SELECT * FROM test_database.test_table;
┌─id─┬─value─┐
│  1 │     2 │
└────┴───────┘

PostgreSQL 테이블에 데이터 쓰기:

INSERT INTO test_database.test_table VALUES (3,4);
SELECT * FROM test_database.test_table;
┌─int_id─┬─value─┐
│      1 │     2 │
│      3 │     4 │
└────────┴───────┘

PostgreSQL에서 테이블 구조가 수정됐다고 생각해 볼게요.

postgre> ALTER TABLE test_table ADD COLUMN data Text

데이터베이스를 만들 때 use_table_cache 매개변수가 1로 설정됐으므로 ClickHouse의 테이블 구조는 캐시되었고 수정되지 않았어요.

DESCRIBE TABLE test_database.test_table;
┌─name───┬─type──────────────┐
│ id     │ Nullable(Integer) │
│ value  │ Nullable(Integer) │
└────────┴───────────────────┘

테이블을 분리하고 다시 붙인 후에는 구조가 업데이트됐어요.

DETACH TABLE test_database.test_table;
ATTACH TABLE test_database.test_table;
DESCRIBE TABLE test_database.test_table;
┌─name───┬─type──────────────┐
│ id     │ Nullable(Integer) │
│ value  │ Nullable(Integer) │
│ data   │ Nullable(String)  │
└────────┴───────────────────┘

더 알아보기 (Learn more)