PostgreSQL 데이터베이스 엔진
PostgreSQL 데이터베이스 엔진
원격 PostgreSQL 서버의 데이터베이스에 연결할 수 있게 해주는 데이터베이스 엔진이에요. ClickHouse와 PostgreSQL 사이 데이터를 교환하는 읽기·쓰기 연산(SELECT와 INSERT 쿼리)을 지원해요.
출처: 문서
본문
원격 PostgreSQL 서버의 데이터베이스에 연결할 수 있게 해줘요. ClickHouse와 PostgreSQL 사이 데이터를 교환하는 읽기·쓰기 연산(SELECT와 INSERT 쿼리)을 지원해요. SHOW TABLES와 DESCRIBE TABLE 쿼리로 원격 PostgreSQL의 테이블 목록과 구조에 실시간 접근을 제공해요. 테이블 구조 수정(ALTER TABLE ... ADD|DROP COLUMN)을 지원해요. use_table_cache 매개변수(아래 엔진 매개변수 참고)가 1로 설정되면 테이블 구조가 캐시되어 수정 여부가 검사되지 않지만, DETACH와 ATTACH 쿼리로 업데이트할 수 있어요.
데이터베이스 만들기 (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) │
└────────┴───────────────────┘