Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

PostgreSQL

允许连接到远程 PostgreSQL 服务器上的数据库。支持读写操作 (SELECTINSERT 查询) ,以便在 ClickHouse 与 PostgreSQL 之间交换数据。

借助 SHOW TABLESDESCRIBE TABLE 查询,可以实时访问远程 PostgreSQL 中的表列表和表结构。

支持表结构修改 (ALTER TABLE ... ADD|DROP COLUMN) 。如果 use_table_cache 参数 (参见下方的引擎参数) 设置为 1,则表结构会被缓存,且不会检查是否发生修改,但可以通过 DETACHATTACH 查询更新。

创建数据库

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

引擎参数

  • host:port — PostgreSQL 服务器地址。
  • database — 远程数据库名称。
  • user — PostgreSQL 用户。
  • password — 用户密码。
  • schema — PostgreSQL schema。
  • use_table_cache — 定义是否缓存数据库表结构。可选。默认值:0

TLS/SSL 参数会转发给 libpq,可通过命名集合提供,也可作为末尾的键值参数提供:sslmode (disableallowpreferrequireverify-caverify-full) ,以及以下两种形式之一的证书和密钥。sslrootcert (CA 证书) 、sslcert (客户端证书) 和 sslkey (客户端私钥) 是服务器本地文件的路径,仅接受服务器配置文件中定义的命名集合提供的值。sslrootcert_pemsslcert_pemsslkey_pem 则接受相应文件的字面内容,可通过 SQL 指定 (例如,ENGINE = PostgreSQL('host:port', 'database', 'user', 'password', sslmode = 'verify-full', sslrootcert_pem = '...')) ,并且会像密码一样在日志和 SHOW 查询中被隐藏。未设置时,将使用 libpq 默认值 (sslmode=prefer) 。

支持的数据类型

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

使用示例

ClickHouse 中的数据库与 PostgreSQL 服务器交换数据:

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)  │
└────────┴───────────────────┘
Navigation