2021-03-14 17:11:26 +00:00
---
2021-02-22 15:41:23 +00:00
toc_priority: 42
2021-03-14 17:11:26 +00:00
toc_title: postgresql
---
# postgresql {#postgresql}
2021-03-30 17:35:38 +00:00
Позволяет выполнять запросы `SELECT` и `INSERT` над таблицами удаленной БД PostgreSQL.
2021-03-14 17:11:26 +00:00
**Синтаксис**
``` sql
2021-03-30 17:35:38 +00:00
postgresql('host:port', 'database', 'table', 'user', 'password'[, `schema` ])
2021-03-14 17:11:26 +00:00
```
2021-03-30 17:35:38 +00:00
**Аргументы**
2021-03-14 17:11:26 +00:00
- `host:port` — адрес сервера PostgreSQL.
2021-02-22 15:41:23 +00:00
- `database` — имя базы данных на удалённом сервере.
- `table` — имя таблицы на удалённом сервере.
2021-03-14 17:11:26 +00:00
- `user` — пользователь PostgreSQL.
- `password` — пароль пользователя.
2021-03-30 17:35:38 +00:00
- `schema` — имя схемы, если не используется схема по умолчанию. Необязательный аргумент.
2021-03-14 17:11:26 +00:00
2021-03-30 17:35:38 +00:00
**Возвращаемое значение**
2021-02-22 15:41:23 +00:00
2021-03-30 17:35:38 +00:00
Таблица с теми же столбцами, что и в исходной таблице PostgreSQL.
2021-02-22 15:41:23 +00:00
2021-03-30 17:35:38 +00:00
!!! info "Примечание"
В запросах `INSERT` для того чтобы отличить табличную функцию `postgresql(...)` от таблицы с о списком имен столбцов вы должны указывать ключевые слова `FUNCTION` или `TABLE FUNCTION` . См. примеры ниже.
2021-02-22 15:41:23 +00:00
2021-03-30 17:35:38 +00:00
## Особенности реализации {#implementation-details}
2021-02-22 15:41:23 +00:00
2021-03-30 17:35:38 +00:00
Запросы `SELECT` на стороне PostgreSQL выполняются как `COPY (SELECT ...) TO STDOUT` внутри транзакции PostgreSQL только на чтение с коммитом после каждого запроса `SELECT` .
2021-02-22 15:41:23 +00:00
2021-03-30 17:35:38 +00:00
Простые условия для `WHERE` такие как `=` , `!=` , `>` , `>=` , `<` , `<=` и `IN` исполняются на стороне PostgreSQL сервера.
2021-02-22 15:41:23 +00:00
2021-03-30 17:35:38 +00:00
В с е операции объединения, аггрегации, сортировки, условия `IN [ array ]` и ограничения `LIMIT` выполняются на стороне ClickHouse только после того как запрос к PostgreSQL закончился.
Запросы `INSERT` на стороне PostgreSQL выполняются как `COPY "table_name" (field1, field2, ... fieldN) FROM STDIN` внутри PostgreSQL транзакции с автоматическим коммитом после каждого запроса `INSERT` .
2021-03-14 17:11:26 +00:00
2021-03-30 17:35:38 +00:00
PostgreSQL массивы конвертируются в массивы ClickHouse.
2021-03-14 17:11:26 +00:00
2021-02-22 15:41:23 +00:00
!!! info "Примечание"
2021-03-30 17:35:38 +00:00
Будьте внимательны, в PostgreSQL массивы, созданные как `type_name[]` , являются многомерными и могут содержать в с е б е разное количество измерений в разных строках одной таблицы. Внутри ClickHouse допустипы только многомерные массивы с одинаковым кол-вом измерений во всех строках таблицы.
При использовании словаря PostgreSQL поддерживается приоритет реплик. Чем больше номер реплики, тем ниже е е приоритет. Наивысший приоритет у реплики с номером `0` .
2021-03-14 17:11:26 +00:00
**Примеры**
2021-02-22 15:41:23 +00:00
Таблица в PostgreSQL:
2021-03-14 17:11:26 +00:00
2021-02-22 15:41:23 +00:00
``` text
postgres=# CREATE TABLE "public"."test" (
"int_id" SERIAL,
"int_nullable" INT NULL DEFAULT NULL,
"float" FLOAT NOT NULL,
"str" VARCHAR(100) NOT NULL DEFAULT '',
"float_nullable" FLOAT NULL DEFAULT NULL,
PRIMARY KEY (int_id));
CREATE TABLE
2021-03-30 17:35:38 +00:00
postgres=# INSERT INTO test (int_id, str, "float") VALUES (1,'test',2);
2021-02-22 15:41:23 +00:00
INSERT 0 1
2021-03-30 17:35:38 +00:00
postgresql> SELECT * FROM test;
2021-04-08 19:32:27 +00:00
int_id | int_nullable | float | str | float_nullable
--------+--------------+-------+------+----------------
1 | | 2 | test |
(1 row)
2021-03-14 17:11:26 +00:00
```
2021-02-22 15:41:23 +00:00
Получение данных в ClickHouse:
2021-03-14 17:11:26 +00:00
2021-02-22 15:41:23 +00:00
```sql
SELECT * FROM postgresql('localhost:5432', 'test', 'test', 'postgresql_user', 'password') WHERE str IN ('test');
2021-03-14 17:11:26 +00:00
```
``` text
2021-02-22 15:41:23 +00:00
┌─int_id─┬─int_nullable─┬─float─┬─str──┬─float_nullable─┐
│ 1 │ ᴺᵁᴸᴸ │ 2 │ test │ ᴺᵁᴸᴸ │
└────────┴──────────────┴───────┴──────┴────────────────┘
2021-03-14 17:11:26 +00:00
```
2021-03-30 17:35:38 +00:00
Вставка данных:
2021-03-14 17:11:26 +00:00
```sql
2021-02-22 15:41:23 +00:00
INSERT INTO TABLE FUNCTION postgresql('localhost:5432', 'test', 'test', 'postgrsql_user', 'password') (int_id, float) VALUES (2, 3);
SELECT * FROM postgresql('localhost:5432', 'test', 'test', 'postgresql_user', 'password');
2021-03-14 17:11:26 +00:00
```
``` text
2021-02-22 15:41:23 +00:00
┌─int_id─┬─int_nullable─┬─float─┬─str──┬─float_nullable─┐
│ 1 │ ᴺᵁᴸᴸ │ 2 │ test │ ᴺᵁᴸᴸ │
│ 2 │ ᴺᵁᴸᴸ │ 3 │ │ ᴺᵁᴸᴸ │
└────────┴──────────────┴───────┴──────┴────────────────┘
2021-03-14 17:11:26 +00:00
```
2021-03-30 17:35:38 +00:00
Using Non-default Schema:
```text
postgres=# CREATE SCHEMA "nice.schema";
postgres=# CREATE TABLE "nice.schema"."nice.table" (a integer);
postgres=# INSERT INTO "nice.schema"."nice.table" SELECT i FROM generate_series(0, 99) as t(i)
```
2021-03-14 17:11:26 +00:00
2021-03-30 17:35:38 +00:00
```sql
CREATE TABLE pg_table_schema_with_dots (a UInt32)
ENGINE PostgreSQL('localhost:5432', 'clickhouse', 'nice.table', 'postgrsql_user', 'password', 'nice.schema');
```
**См. также**
- [Движок таблиц PostgreSQL ](../../sql-reference/table-functions/postgresql.md )
2021-02-22 15:41:23 +00:00
- [Использование PostgreSQL как источника данных для внешнего словаря ](../../sql-reference/table-functions/postgresql.md#dicts-external_dicts_dict_sources-postgresql )
2021-03-30 17:35:38 +00:00
[Оригинальная статья ](https://clickhouse.tech/docs/ru/sql-reference/table-functions/postgresql/ ) <!--hide-->