Всем привет.
Сегодня я хочу кратенько познакомить вас с Foreign Database Wrappers в PostgreSQL. Поведаю о том, откуда это пришло в PostgreSQL, зачем и что оно там делает.
Погнали!
В 2003 году в SQL был введён новый стандарт — Управление внешними данными.
Этот стандарт описывает способ взаимодействия с внешними источниками данных.
В PostgreSQL v.9.1 (2011 год) был реализован этот стандарт в виде FDW (Foreign Database Wrapper), но readonly. Возможность писать во внешние источники данных через FDW в постгресе появилась в версии 9.3, т.е. два года спустя. Однако, действительные возможности FDW закладываются в конкретной реализации, т.е. не все FDW, существующие на данный момент, поддерживают запись во внешнее хранилище.
Список доступных FDW можно посмотреть в вики постгреса (https://wiki.postgresql.org/wiki/Foreign_data_wrappers).
Окунёмся в мир FDW на примере обёртки для СУБД Informix (https://github.com/credativ/informix_fdw).
Для начала давайте выясним, какие задачи можно решить, используя FDW:
- Синхронизация PostgreSQL с внешней иной СУБД.
- Как следствие первого пункта — манипулирование данными, находящимися во внешней СУБД.
Что может вас заставить использовать FDW, а не какой-либо иной путь?
- При использовании FDW, PostgreSQL не хранит сами данные, что может быть удобно, если вы ограничены по ресурсам.
- Нет необходимости поднимать инстанс внешней СУБД у себя для реализации синхронизации БД, что удобно в случае с платными СУБД.
Как же работает FDW?
Если говорить простым языком, то
при обращении к PostgreSQL (далее, PG), PG делает аналогичный* запрос во внешнюю СУБД и возвращает вам результат этого запроса.
- Следует помнить, что не смотря на существующие стандарты SQL, для разных СУБД запрос SQL выглядит по разному. Привести запрос к нужному виду — это задача FDW.
Если говорить сложным языком, то
- Во-первых, в PG таблицы создаются специального типа — FOREIGN TABLE.
- Во-вторых, при создании такой таблицы, необходимо указать настройки подключения к СУБД: сервер, пользователь, имя самой базы и т.д. Давайте взглянем на живой пример:
CREATE SERVER any_server_name
FOREIGN DATA WRAPPER informix_fdw # Это имя FDW
OPTIONS (informixserver ‘remote_db_server_name’);
# Создаём мапинг пользователя постгре к пользователю информикса,
# т.е. текущий pg юзер будет дуплиться в информикс под username:password
CREATE USER MAPPING FOR CURRENT_USER
SERVER any_server_name
# Имя и Пароль для доступа к удалённой БД
OPTIONS (username ‘informix’, password ‘informix’);
CREATE FOREIGN TABLE our_table_name (remote_id integer, year smallint)
SERVER any_server_name
OPTIONS ( query ‘SELECT * FROM remote_table_name’,
database ‘remote_db_name’,
db_locale ‘ru_RU.8859-5’, # remote
client_locale ‘ru_RU.8859-5’,
informixserver ‘remote_db_server_name’,
informixdir ‘/opt/informix’ # путь до СУБД
);
В чём подвох?
В том, что FDW реализуют сторонние разработчики, которые в силу различных причин, не реализуют все необходимые структуры, функции и так далее.
Чтобы было понятнее, если в FDW не реализовать обработку какого-либо типа во внешней СУБД, то вы не сможете извлечь данные этого типа. Единственный способ — использовать преобразование типов при запросе.
Вот и всё (: