SELECT и INSERT к данным, хранящимся на удаленном сервере PostgreSQL.
Синтаксис
Аргументы
Аргументы также можно передавать с помощью именованных коллекций. В этом случае
host и port нужно указывать отдельно. Такой подход рекомендуется для производственной среды.
Возвращаемое значение
В запросе
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:
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 допускаются только многомерные массивы одинаковой размерности во всех строках.
|. Например:
0.
Примеры
Репликация или миграция данных Postgres с помощью PeerDB
Помимо табличных функций, вы также можете использовать PeerDB от ClickHouse, чтобы настроить непрерывный конвейер передачи данных из Postgres в ClickHouse. PeerDB — это инструмент, специально разработанный для репликации данных из Postgres в ClickHouse с использованием CDC (фиксации изменений данных).