Интеграция ADQM и ADPG
Обзор
ClickHouse предоставляет несколько способов интеграции с PostgreSQL:
-
табличная функция postgresql | табличный движок PostgreSQL | движок баз данных PostgreSQL — обеспечивают возможность отправлять запросы из ClickHouse к таблицам/базам данных на сервере PostgreSQL для обмена данными в реальном времени. Поддерживаются операции чтения и записи данных PostgreSQL. При выполнении запроса
SELECT
илиINSERT
ClickHouse подключается к таблице/базе данных PostgreSQL и получает актуальные данные PostgreSQL или экспортирует новые данные. Иными словами, данные хранятся в PostgreSQL, а из ClickHouse можно к ним обращаться. -
табличный движок MaterializedPostgreSQL | движок баз данных MaterializedPostgreSQL — позволяют использовать ClickHouse в качестве реплики PostgreSQL. При создании таблицы/базы данных MaterializedPostgreSQL в ClickHouse создается исходный дамп данных таблицы или таблиц базы данных PostgreSQL и запускается процесс репликации — в фоновом режиме к таблице/базе данных MaterializedPostgreSQL применяются изменения данных, выполненные на стороне PostgreSQL. Таким образом, при использовании движков MaterializedPostgreSQL в отличие от движков PostgreSQL данные хранятся и в PostgreSQL, и в ClickHouse.
-
тип источника данных POSTGRESQL для словарей — позволяет использовать таблицы PostgreSQL в качестве источника данных для словарей в ClickHouse.
В этой статье описываются особенности и способы использования этих инструментов на примере ADQM и ADPG (Arenadata Postgres — реляционная система управления базами данных, основанная на PostgreSQL). Приводятся запросы для вызова табличной функции и создания таблиц/баз данных на основе перечисленных интеграционных движков, а также примеры запросов для чтения/записи данных ADPG из ADQM.
На хосте ADPG запустите терминальный клиент psql от имени пользователя по умолчанию postgres
с помощью команд:
$ sudo su - postgres
$ psql
Теперь в psql можно вводить команды для работы с базами данных и таблицами PostgreSQL:
psql (14.1) Type "help" for help. postgres=#
ПРИМЕЧАНИЕ
Обзор по работе с PostgreSQL-таблицами в psql можно посмотреть в статье документации ADPG Пример работы с таблицами через psql. |
Создание пользователя PostgreSQL
Создайте пользователя (с правами суперпользователя для демонстрационных целей), от имени которого будет выполняться подключение к ADPG из ADQM:
CREATE ROLE adqm_user SUPERUSER LOGIN PASSWORD '<adqm_user_secret_password>';
Создание базы данных и таблицы ADPG для примеров с табличной функцией и движками PostgreSQL
-
Создайте в ADPG базу данных
adpg_db1
:CREATE DATABASE adpg_db1;
Используйте psql-команду
\c
для подключения к этой базе данных:\c adpg_db1
Результат выполнения команды:
You are now connected to database "adpg_db1" as user "postgres". adpg_db1=#
-
Создайте таблицу:
CREATE TABLE table1 (id INTEGER PRIMARY KEY, name VARCHAR(10));
-
Добавьте в таблицу тестовые данные:
INSERT INTO table1 (id, name) VALUES (1, 'one'), (2, 'two');
Создание базы данных с таблицами ADPG для примеров с движками MaterializedPostgreSQL
-
Создайте в ADPG новую базу данных
adpg_db2
и подключитесь к ней:CREATE DATABASE adpg_db2;
\c adpg_db2
-
Создайте в базе данных
adpg_db2
три таблицы с одинаковой структурой:CREATE TABLE table1 (id INTEGER PRIMARY KEY, name VARCHAR(10));
CREATE TABLE table2 (id INTEGER PRIMARY KEY, name VARCHAR(10));
CREATE TABLE table3 (id INTEGER PRIMARY KEY, name VARCHAR(10));
-
Добавьте в эти таблицы тестовые данные:
INSERT INTO table1 (id, name) VALUES (1, 'one'), (2, 'two');
INSERT INTO table2 (id, name) VALUES (3, 'three'), (4, 'four');
INSERT INTO table3 (id, name) VALUES (5, 'five'), (6, 'six');
Создание таблицы ADPG, источника данных для словаря
Создайте в базе данных adpg_db2
таблицу roles_dict
, которая будет источником данных для словаря:
CREATE TABLE roles_dict (id INTEGER PRIMARY KEY, role VARCHAR(10));
INSERT INTO roles_dict (id, role) VALUES (10, 'admin'), (20, 'owner'), (30, 'author'), (40, 'reviewer'), (50, 'editor'), (60, 'view only');
Настройка аутентификации для соединения с ADPG
Чтобы разрешить подключение к базам данных adpg_db1
и adpg_db2
с хоста ADQM от имени пользователя adqm_user
и настроить аутентификацию по паролю, необходимо добавить следующие записи в файл pg_hba.conf (для ADPG это можно сделать через интерфейс ADCM — подробнее в статье Аутентификация по паролю):
host adpg_db1 adqm_user <adqm_host_address> password host adpg_db2 adqm_user <adqm_host_address> password
где <adqm_host_address>
— адрес хоста ADQM (например, если IPv4-адрес хоста ADQM — 10.92.40.25
, замените <adqm_host_address>
на 10.92.40.25/32
). Подробное описание поля address
и других полей записей файла pg_hba.conf приведены в статье The pg_hba.conf file.
Основные параметры интеграции
При вызове табличной функции postgresql
и создании таблиц/баз данных на основе движков для интеграции с PostgreSQL (базовый синтаксис запросов приводится в соответствующих разделах ниже) необходимо указывать следующие параметры.
<postgres_host> |
Адрес сервера PostgreSQL (IP или имя хоста) |
<postgres_database> |
Имя базы данных PostgreSQL |
<postgres_table> |
Имя таблицы в базе данных PostgreSQL (указывается для табличной функции |
<postgres_user> |
Имя пользователя PostgreSQL, от имени которого ClickHouse подключается к PostgreSQL |
<user_password> |
Пароль пользователя PostgreSQL |
<schema> |
Схема PostgreSQL (опционально может быть указана для табличной функции |
Табличная функция postgresql
Табличная функция postgresql
позволяет направлять запросы SELECT
и INSERT
к таблицам в базах данных PostgreSQL.
Синтаксис функции:
postgresql('<postgres_host>:5432', '<postgres_database>', '<postgres_table>', '<postgres_user>', '<user_password>'[, '<schema>'])
Описание параметров приведено выше.
Пример
Чтение данных из ADPG
Выполните следующий запрос, чтобы получить в ADQM данные из таблицы ADPG adpg_db1.table1
с помощью функции postgresql
:
SELECT id, name FROM postgresql('<adpg_host>:5432', 'adpg_db1', 'table1', 'adqm_user', '<adqm_user_secret_password>');
где <adpg_host>
— адрес хоста ADPG (IP или имя хоста).
Результат:
┌─id─┬─name──┐ │ 1 │ one │ │ 2 │ two │ └────┴───────┘
Запись данных в ADPG
Выполните следующий запрос, чтобы добавить новую запись в таблицу ADPG:
INSERT INTO TABLE FUNCTION postgresql('<adpg_host>:5432', 'adpg_db1', 'table1', 'adqm_user', '<adqm_user_secret_password>') (id, name)
VALUES (3, 'three');
Убедитесь, что данные записались в таблицу назначения. Для этого на хосте ADPG выполните следующую команду, предварительно подключившись к базе данных adpg_db1
:
SELECT * FROM table1;
id | name ----+------- 1 | one 2 | two 3 | three (3 rows)
Табличный движок PostgreSQL
Табличный движок PostgreSQL позволяет направлять запросы SELECT
и INSERT
к таблицам на удаленном сервере PostgreSQL.
Создание таблицы
Базовый синтаксис запроса для создания таблицы PostgreSQL (описание параметров приведено выше):
CREATE TABLE <table_name> (<column_name> <column_type> [DEFAULT|MATERIALIZED|ALIAS <expr>] [TTL <expr>], ...)
ENGINE = PostgreSQL('<postgres_host>:5432', '<postgres_database>', '<postgres_table>', '<postgres_user>', '<user_password>'[, '<schema>']);
Структура таблицы ADQM может отличаться от структуры таблицы PostgreSQL, к которой осуществляется подключение:
-
Имена столбцов должны быть такими же, как в исходной таблице PostgreSQL, но количество и порядок столбцов не обязательно должны совпадать.
-
Типы столбцов в таблице ADQM могут отличаться от типов в исходной таблице PostgreSQL — ADQM пытается приводить значения к типам данных ClickHouse.
-
Настройка external_table_functions_use_nulls определяет, как обрабатываются Nullable-столбцы. Значение по умолчанию:
1
. Если значение0
, столбцы не преобразуются в Nullable — вместо NULL в столбце выставляются значения по умолчанию для соответствующего типа данных. Это также применимо для значений NULL в массивах.
Пример
В ADQM создайте таблицу на базе движка PostgreSQL и запросите из нее данные:
CREATE TABLE psql_table (id Int32, name String)
ENGINE = PostgreSQL('<adpg_host>:5432', 'adpg_db1', 'table1', 'adqm_user', '<adqm_user_secret_password>');
SELECT * FROM psql_table;
┌─id─┬─name──┐ │ 1 │ one │ │ 2 │ two │ │ 3 │ three │ └────┴───────┘
Вставьте данные в таблицу ADQM:
INSERT INTO psql_table VALUES (4, 'four');
На хосте ADPG запросите данные из таблицы adpg_db1.table1
, чтобы проверить, что в нее успешно были импортированы данные из ADQM:
SELECT * FROM table1;
id | name ----+------- 1 | one 2 | two 3 | three 4 | four (4 rows)
Движок баз данных PostgreSQL
Движок баз данных PostgreSQL позволяет подключаться к базе данных на сервере PostgreSQL и выполнять операции чтения и записи (запросы SELECT
и INSERT
) для обмена данными между ClickHouse и PostgreSQL, а также в реальном времени получать от сервера PostgreSQL информацию о таблицах базы данных и их структуре с помощью запросов SHOW TABLES
и DESCRIBE TABLE
.
Создание базы данных
Базовый синтаксис запроса для создания базы данных PostgreSQL в ADQM:
CREATE DATABASE <database_name>
ENGINE = PostgreSQL('<postgres_host>:5432', '<postgres_database>', '<postgres_user>', '<user_password>'[, `<schema>`, `use_table_cache`]);
Описание основных параметров приведено выше. Необязательный параметр use_table_cache
определяет, кешируются ли структуры таблиц. Если значение параметра 1
, структура таблицы кешируется и изменения в ней не отслеживаются. Чтобы обновить структуру таблицы, нужно последовательно выполнить команды DETACH TABLE
и ATTACH TABLE
.
Пример
Создайте в ADQM базу данных psql_database
на основе движка PostgreSQL:
CREATE DATABASE psql_database
ENGINE = PostgreSQL('<adpg_host>:5432', 'adpg_db1', 'adqm_user', '<adqm_user_secret_password>', 1);
Проверьте, что новая база данных добавлена в список баз данных ADQM:
SHOW DATABASES;
┌─name───────────────┐ │ INFORMATION_SCHEMA │ │ default │ │ information_schema │ │ psql_database │ │ system │ └────────────────────┘
Посмотрите, какие таблицы есть в базе данных psql_database
:
SHOW TABLES FROM psql_database;
┌─name───┐ │ table1 │ └────────┘
Запросите данные из таблицы:
SELECT * FROM psql_database.table1;
┌─id─┬─name──┐ │ 1 │ one │ │ 2 │ two │ │ 3 │ three │ │ 4 │ four │ └────┴───────┘
Добавьте новые данные в таблицу на стороне ADPG:
INSERT INTO table1 (id, name) VALUES (5, 'five');
Проверьте, что эти данные доступны через таблицу ADQM:
SELECT * FROM psql_database.table1;
┌─id─┬─name──┐ │ 1 │ one │ │ 2 │ two │ │ 3 │ three │ │ 4 │ four │ │ 5 │ five │ └────┴───────┘
На хосте ADPG измените структуру таблицы adpg_db1.table1
, добавив в нее новый столбец:
ALTER TABLE table1 ADD COLUMN value SMALLINT;
Структура таблицы на стороне ADQM не поменяется, так как при создании базы данных параметр use_table_cache
был установлен в 1
(значит, структура таблицы в ADQM была закеширована):
DESCRIBE TABLE psql_database.table1;
┌─name─┬─type─────────────┬─ │ id │ Int32 │ │ name │ Nullable(String) │ └──────┴──────────────────┴─
Если таблицу в ADQM отключить, а затем снова подключить, структура таблицы обновится:
DETACH TABLE psql_database.table1;
ATTACH TABLE psql_database.table1;
DESCRIBE TABLE psql_database.table1;
┌─name──┬─type─────────────┬─ │ id │ Int32 │ │ name │ Nullable(String) │ │ value │ Nullable(Int16) │ └───────┴──────────────────┴─
Табличный движок MaterializedPostgreSQL
Табличный движок MaterializedPostgreSQL создает таблицу ClickHouse с исходным дампом данных таблицы PostgreSQL и запускает процесс репликации, то есть в фоновом режиме к таблице ADQM применяются изменения, произведенные в таблице PostgreSQL.
Если требуется реплицировать в ADQM более одной таблицы PostgreSQL, вместо табличного движка рекомендуется использовать движок баз данных MaterializedPostgreSQL и с помощью настройки materialized_postgresql_tables_list
указать таблицы базы данных PostgreSQL, которые нужно реплицировать. Это позволит оптимизировать нагрузку на процессор, уменьшить количество подключений и количество слотов репликации в базе данных PostgreSQL.
ВНИМАНИЕ
Репликация TOAST-значений не поддерживается. Для типа данных используется значение по умолчанию.
|
Требования
Для использования табличного движка MaterializedPostgreSQL необходимо выполнение следующих условий:
-
В конфигурационном файле PostgreSQL настройка
wal_level
должна иметь значениеlogical
, значение параметраmax_replication_slots
должно быть не меньше2
(подробнее об этих параметрах и о том, как их настроить в ADPG, написано в статье Логическая репликация). -
Таблица, созданная на основе движка MaterializedPostgreSQL, должна иметь такой же первичный ключ, как репликационный идентификатор (обычно это первичный ключ) таблицы PostgreSQL.
-
Таблица MaterializedPostgreSQL может быть создана только в базе данных Atomic.
Создание таблицы
Базовый синтаксис запроса для создания таблицы на основе движка MaterializedPostgreSQL:
CREATE TABLE <table_name> (<key_column_name> <key_column_type>, <column_name> <column_type>, ...)
ENGINE = MaterializedPostgreSQL('<postgres_host>:5432', '<postgres_database>', '<postgres_table>', '<postgres_user>', '<user_password>')
PRIMARY KEY <key_column_name>;
Описание параметров приведено выше.
Виртуальные столбцы
В таблицу MaterializedPostgreSQL автоматически добавляются следующие виртуальные столбцы, которые доступны в запросах SELECT
:
-
_version
(UInt64) — счетчик транзакций (значение LSN в WAL); -
_sign
(Int8) — метка удаления. Возможные значения:-
1
— строка не удалена; -
-1
— строка удалена.
-
Пример
Настройка ADPG
В ADPG настройте следующие параметры конфигурации, необходимые для логической репликации, с помощью которой реализуется репликация через табличный движок MaterializedPostgreSQL:
-
значение параметра
wal_level
—logical
; -
значение параметра
max_replication_slots
— не меньше2
.
Создание таблицы MaterializedPostgreSQL
В ADQM создайте таблицу MaterializedPostgreSQL:
CREATE TABLE psql_table_replica (id Int32, name String)
ENGINE = MaterializedPostgreSQL('<adpg_host>:5432', 'adpg_db2', 'table1', 'adqm_user', '<adqm_user_secret_password>')
PRIMARY KEY id;
В созданную таблицу ADQM автоматически вставятся данные из исходной таблицы ADPG:
SELECT * FROM psql_table_replica;
┌─id─┬─name──┐ │ 1 │ one │ │ 2 │ two │ └────┴───────┘
Тестирование репликации
В ADPG добавьте новые строки в таблицу adpg_db2.table1
:
INSERT INTO table1 (id, name) VALUES (11, 'eleven'), (22, 'twenty two');
Убедитесь, что новые строки реплицированы в таблицу ADQM:
SELECT * FROM psql_table_replica;
┌─id─┬─name──┐ │ 1 │ one │ │ 2 │ two │ └────┴───────┘ ┌─id─┬─name───────┐ │ 11 │ eleven │ │ 22 │ twenty two │ └────┴────────────┘
Движок баз данных MaterializedPostgreSQL
Движок баз данных MaterializedPostgreSQL позволяет создать базу данных ADQM с таблицами из базы данных PostgreSQL. При создании базы данных на основе движка MaterializedPostgreSQL создается снепшот базы данных PostgreSQL и в базу данных MaterializedPostgreSQL загружаются необходимые таблицы (это может быть любой набор таблиц из любого набора схем базы данных PostgreSQL). База данных MaterializedPostgreSQL получает исходный дамп данных таблиц PostgreSQL и запускает процесс репликации — читает WAL и выполняет запросы DML, применяя изменения данных, которые были произведены в базе данных PostgreSQL.
Репликация реализована с помощью протокола логической репликации PostgreSQL, который не поддерживает репликацию запросов DDL, но позволяет определять изменения, нарушающие репликацию (например, изменение типа столбца, добавление/удаление столбцов). При таких изменениях соответствующие таблицы перестают получать обновления. В этом случае следует выполнить запросы ATTACH TABLE
/DETACH TABLE
для перезагрузки таблицы. Если DDL-запрос не нарушает репликацию (например, переименование столбца), таблица будет продолжать получать обновления (вставка производится по позиции, а не по имени столбца).
ВАЖНО
|
Требования
Чтобы создавать и использовать базы данных на движке MaterializedPostgreSQL необходимо выполнение следующих условий:
-
В конфигурационном файле в PostgreSQL настройка
wal_level
должна иметь значениеlogical
, значение параметраmax_replication_slots
должно быть не меньше2
(подробнее об этих параметрах и о том, как их настроить в ADPG, написано в статье Логическая репликация). -
Каждая реплицируемая таблица должна иметь репликационный идентификатор — первичный ключ (по умолчанию) или индекс, определенный как REPLICA IDENTITY.
Создание базы данных
Синтаксис запроса для создания базы данных на основе движка MaterializedPostgreSQL в общем виде:
CREATE DATABASE <database_name>
ENGINE = MaterializedPostgreSQL('<postgres_host>:5432', '<postgres_database>', '<postgres_user>', '<user_password>')
[SETTINGS ...];
Описание параметров приведено выше.
Настройки
Через выражение SETTINGS
для базы данных MaterializedPostgreSQL можно указать следующие настройки.
materialized_postgresql_tables_list |
Список таблиц базы данных PostgreSQL (разделяются запятыми), которые будут реплицироваться через движок баз данных MaterializedPostgreSQL.
|
materialized_postgresql_schema |
Схема базы данных PostgreSQL, таблицы которой будут реплицироваться |
materialized_postgresql_schema_list |
Список схем базы данных PostgreSQL (разделяются запятыми), все таблицы которых будут реплицироваться. Если для базы данных MaterializedPostgreSQL через параметр
|
materialized_postgresql_max_block_size |
Максимальное количество строк, собранных в памяти перед вставкой данных в таблицу базы данных PostgreSQL |
materialized_postgresql_replication_slot materialized_postgresql_snapshot |
Идентификатор созданного пользователем слота репликации и идентификатор снепшота, из которого будет выполняться исходный дамп таблиц PostgreSQL. Обе эти настройки должны быть указаны вместе. Использовать их рекомендуется только в случае реальной необходимости — например, если нужно определить постоянный слот репликации, чтобы избежать нарушения репликации данных PostgreSQL в случае сбоя основного сервера (за более подробной информацией и примером можно обратиться к разделу Failover of the logical replication slot документации ClickHouse). Обычно самостоятельно конфигурировать слот репликации не нужно — он создается таблицей |
Динамическое добавление и удаление таблиц из репликации
После того, как база данных MaterializedPostgreSQL создана, новые таблицы, добавляемые в базу данных PostgreSQL, не попадают автоматически в репликацию — их необходимо добавить вручную с помощью запроса ATTACH TABLE
. Этот запрос можно также использовать, чтобы добавить таблицу в список materialized_postgresql_tables_list
, указанный при создании базы данных.
Удалить из репликации отдельные таблицы можно с помощью запроса DETACH TABLE
.
Пример
Настройка ADPG
Движок баз данных MaterializedPostgreSQL требует те же настройки логической репликации в ADPG, что и табличный движок MaterializedPostgreSQL. В ADPG убедитесь, что:
-
параметр
wal_level
установлен вlogical
; -
значение параметра
max_replication_slots
не меньше2
.
Создание базы данных MaterializedPostgreSQL
В ADQM включите возможность работы с движком баз данных MaterializedPostgreSQL и создайте базу данных:
SET allow_experimental_database_materialized_postgresql=1;
CREATE DATABASE psql_db_replica
ENGINE = MaterializedPostgreSQL('<adpg_host>:5432', 'adpg_db2', 'adqm_user', '<adqm_user_secret_password>')
SETTINGS materialized_postgresql_tables_list = 'table1,table2';
Посмотрите, какие таблицы содержатся в базе данных:
SHOW TABLES FROM psql_db_replica;
┌─name───┐ │ table1 │ │ table2 │ └────────┘
Получите данные одной из таблиц (например, table2
):
SELECT * FROM psql_db_replica.table2;
┌─id─┬─name──┐ │ 3 │ three │ │ 4 │ four │ └────┴───────┘
Тестирование репликации
В ADPG добавьте новую запись в таблицу adpg_db2.table2
:
INSERT INTO table2 (id, name) VALUES (30, 'thirty');
Убедитесь, что эта запись попала в таблицу-реплику в ADQM:
SELECT * FROM psql_db_replica.table2;
┌─id─┬─name───┐ │ 3 │ three │ │ 4 │ four │ │ 30 │ thirty │ └────┴────────┘
Добавление новой таблицы в репликацию
Чтобы указать дополнительную таблицу базы данных ADPG для репликации в базу данных ADQM (иными словами, изменить список materialized_postgresql_tables_list
базы данных MaterializedPostgreSQL), выполните команду ATTACH TABLE
:
ATTACH TABLE psql_db_replica.table3;
Теперь таблица table3
также реплицируется в базу данных psql_db_replica
:
SHOW TABLES FROM psql_db_replica;
┌─name───┐ │ table1 │ │ table2 │ │ table3 │ └────────┘
SELECT * FROM psql_db_replica.table3;
┌─id─┬─name─┐ │ 5 │ five │ │ 6 │ six │ └────┴──────┘
Источник данных для словаря типа POSTGRESQL
Таблицу PostgreSQL можно назначить источником данных для словаря в ClickHouse/ADQM. Для этого при создании словаря в запросе CREATE DICTIONARY
укажите тип источника POSTGRESQL
в выражении SOURCE
и настройте параметры подключения к таблице PostgreSQL следующим образом:
CREATE DICTIONARY <dictionary_name> (...)
...
SOURCE(POSTGRESQL(
port 5432
host '<postgres_host>'
user '<postgres_user>'
password '<postgres_user_password>'
replica(host 'postgres_host_1' port 5432 priority 1)
replica(host 'postgres_host_2' port 5432 priority 2)
db '<postgres_database>'
table '<postgres_table>'
where '<filter_expr>'
invalidate_query '<query_to_check_dictionary_status>'
query '<custom_query>'))
...
Конфигурация источника данных словаря типа POSTGRESQL включает следующие поля:
-
port
— порт PostgreSQL. -
host
— хост PostgreSQL. -
user
— имя пользователя PostgreSQL, от имени которого ClickHouse будет подключаться к PostgreSQL. -
password
— пароль пользователя PostgreSQL. -
replica
— настройки подключения к реплике PostgreSQL.При определении источника данных для словаря можно сконфигурировать общие настройки подключения к PostgreSQL (
host
,port
,user
иpassword
) или указать несколько реплик и каждую настроить отдельно — в полеreplica
указать хост и порт для подключения к реплике, а также назначить реплике приоритет, который ClickHouse будет учитывать при попытке соединения с PostgreSQL (чем меньше значениеpriority
, тем выше приоритет реплики). -
db
— имя базы данных PostgreSQL. -
table
— имя таблицы в базе данных PostgreSQL. -
where
— условие выборки (необязательный параметр). -
invalidate_query
— запрос для проверки условия загрузки словаря (необязательный параметр). -
query
— пользовательский запрос (необязательный параметр).
Источник данных обязательно должен быть объявлен через одно из полей: table
или query
. Поля table
и where
не могут быть использованы одновременно с query
.
Пример
В ADQM создайте словарь, который будет считывать данные из таблицы ADPG adpg_db2.roles_dict
:
CREATE DICTIONARY roles_dict_psql (id Int32, role String DEFAULT 'no role assigned')
PRIMARY KEY id
SOURCE(POSTGRESQL(port 5432 host '<adpg_host_name>' user 'adqm_user' password '<adqm_user_secret_password>' db 'adpg_db2' table 'roles_dict'))
LIFETIME(MIN 10 MAX 20)
LAYOUT(FLAT());
Создайте таблицу users
с именами пользователей и идентификаторами назначенных им ролей:
CREATE TABLE users (user_id Int32, name String, role_id Int32) ENGINE = MergeTree ORDER BY user_id;
INSERT INTO users VALUES (1, 'john', 10), (2, 'mary', 30), (3, 'andrew', 40), (4, 'harry', 70), (5, 'ann', 50);
--user_id---name-----role_id-- │ 1 │ john │ 10 │ │ 2 │ mary │ 30 │ │ 3 │ andrew │ 40 │ │ 4 │ harry │ 70 │ │ 5 │ ann │ 50 │ ------------------------------
Выполните следующий запрос, чтобы считать имена пользователей из таблицы users
и найти названия их ролей в словаре roles_dict_psql
по идентификаторам role_id
:
SELECT name AS user, dictGet('roles_dict_psql', 'role', toUInt64(role_id)) AS role FROM users;
Результат:
┌─user───┬─role─────────────┐ │ john │ admin │ │ mary │ author │ │ andrew │ reviewer │ │ harry │ no role assigned │ │ ann │ editor │ └────────┴──────────────────┘