Skip to main content
Позволяет выполнять запросы SELECT и INSERT к данным, хранящимся на удаленном сервере PostgreSQL.

Синтаксис

Аргументы

Аргументы также можно передавать с помощью именованных коллекций. В этом случае host и port нужно указывать отдельно. Такой подход рекомендуется для производственной среды.

Возвращаемое значение

Объект таблицы с теми же столбцами, что и исходная таблица PostgreSQL.
В запросе INSERT, чтобы отличить табличную функцию postgresql(...) от имени таблицы со списком имён столбцов, необходимо использовать ключевые слова FUNCTION или TABLE FUNCTION. См. примеры ниже.

Настройки

Пул соединений, используемый табличной функцией postgresqlдвижком таблицы PostgreSQL), можно настроить с помощью завершающей секции SETTINGS. Если параметр не указан, по умолчанию используется значение соответствующего параметра уровня запроса postgresql_*. Полный список параметров postgresql_connection_pool_* и postgresql_connection_attempt_timeout, а также их значения по умолчанию см. в разделе Настройки для этого движка таблицы. Пример:

Подробности реализации

SELECT-запросы на стороне PostgreSQL выполняются как COPY (SELECT ...) TO STDOUT внутри PostgreSQL-транзакции в режиме только для чтения с фиксацией после каждого SELECT-запроса. Простые предложения WHERE, такие как =, !=, >, >=, <, <= и IN, выполняются на сервере PostgreSQL. Все JOIN, агрегации, сортировка, условия IN [ array ] и ограничение сэмплирования LIMIT выполняются в ClickHouse только после завершения запроса к PostgreSQL.

Передача запроса вместо имени таблицы

Вместо имени таблицы третьим аргументом может быть SELECT-запрос, который передается в PostgreSQL как есть. Структура результирующей таблицы определяется по результату запроса. Запрос можно записать либо как подзапрос, либо обернуть в функцию query:
Это полезно, чтобы проталкивать JOIN, агрегации и любую другую обработку в PostgreSQL. Такая таблица доступна только в режиме только для чтения: INSERT в неё не поддерживается. Тот же синтаксис поддерживается движком таблицы PostgreSQL.
Форма подзапроса (SELECT ...) разбирается ClickHouse и повторно сериализуется в диалект PostgreSQL (с экранированием идентификаторов PostgreSQL и строковых литералов) перед отправкой на сервер. Поэтому она должна быть корректным ClickHouse SQL. Чтобы передать синтаксис, специфичный для PostgreSQL и не разбираемый ClickHouse, используйте форму query('...'), текст которой отправляется в PostgreSQL дословно.Любой внешний WHERE, LIMIT, агрегация и т. д. из окружающего запроса ClickHouse не проталкиваются в переданный запрос — они применяются в ClickHouse после получения полного результата запроса. Чтобы ограничить объём данных, читаемых из PostgreSQL, поместите фильтр внутрь переданного запроса. При external_table_strict_query = 1 внешний фильтр, который нельзя протолкнуть, отклоняется с исключением вместо локального применения.
INSERT-запросы на стороне PostgreSQL выполняются как COPY "table_name" (field1, field2, ... fieldN) FROM STDIN внутри PostgreSQL-транзакции с автофиксацией после каждого оператора INSERT. Типы Array в PostgreSQL преобразуются в массивы ClickHouse.
Будьте внимательны: в PostgreSQL столбец с типом массива, например Integer[], может содержать массивы разной размерности в разных строках, но в ClickHouse допускаются только многомерные массивы одинаковой размерности во всех строках.
Поддерживается несколько реплик, которые должны быть перечислены через |. Например:
или
Поддерживает приоритеты реплик для источника словаря PostgreSQL. Чем больше число в карте, тем ниже приоритет. Наивысший приоритет — 0.

Примеры

Таблица в PostgreSQL:
Выбор данных из ClickHouse с помощью обычных аргументов:
Или с помощью именованных коллекций:
Вставка:
Использование нестандартной схемы:

Репликация или миграция данных Postgres с помощью PeerDB

Помимо табличных функций, вы также можете использовать PeerDB от ClickHouse, чтобы настроить непрерывный конвейер передачи данных из Postgres в ClickHouse. PeerDB — это инструмент, специально разработанный для репликации данных из Postgres в ClickHouse с использованием CDC (фиксации изменений данных).
Последнее изменение 23 июля 2026 г.