Свободная система управления базами данных PostgreSQL не только предоставляет высокопроизводительный движок для выполнения запросов, но и может быть расширена с помощью расширений, которые могут добавлять новые типы данных (например, для ГИС-расширений или астрономических координат), дополнительные типы индекса и возможности поиска (например, полнотекстовый поиск), сбор статистики, поддержку новых языков для встроенных функций и многое другое. Большой список существующих расширений может быть найден по этой ссылке. В этой статье мы рассмотрим один из возможных вариантов по созданию собственного расширения для PostgreSQL с использованием библиотеки pgx. Для разработки расширения будет необходимо установить актуальную версию Rust не менее 1.6.4 и cargo для управления пакетами. Также должен быть установлен rustfmt, clang и libclang-dev, а также libreadline-dev (на Debian/Ubuntu):  Установка библиотеки выполняется через cargo: Далее становится возможным настройка окружение и создание каркаса нового расширения через подкоманды cargo pgx: cargo pgx init - подготовка среды выполнения (загружает также версии PostgreSQL с 11 до 15-й); cargo pgx new <name> - создает новый проект с заготовкой плагина; cargo pgx run - запускает экземпляр PostgreSQL, компилирует плагин и устанавливает его в PostgreSQL и предоставляет доступ к консоли для выполнения команд (можно дополнительно указать версию pg11, pg12, pg13, pg14 или pg15); cargo pgx connect - подключается к активному экземпляру PostgreSQL через psql; cargo pgx install - установка расширения в активный экземпляр PostgreSQL (из pg_config); cargo pgx schema - создание схемы данных для расширения; cargo pgx start - запуск управляемого сервера PostgreSQL; cargo pgx stop - остановка управляемого сервера PostgreSQL; cargo pgx status - получить статус управляемого сервера; cargo pgx package - упаковка расширения для дальнейшей установки в любой поддерживаемый сервер PostgreSQL (через CREATE EXTENSION); cargo pgx test - запуск автоматических тестов для расширения. Создаваемое по умолчанию расширение регистрирует функцию hello_<название_проекта>. Проверим корректность работы расширения, для этого сначала подключим расширение к PostgreSQL, а затем вызовем функцию. Для определенности будем считать, что расширение называется testext (было создано через cargo pgx new testext) Результатом выполнения будет отображена строка Hello, testext! Для сборки расширения как самостоятельного пакета добавим путь к pg_config: В результате сборки проекта мы получим файл с библиотекой (.so для linux) в подкаталоге target. Посмотрим на организацию проекта и предоставляемые возможности. Функции регистрируется в файле lib.rs. Здесь внешняя функция регистрируется как pg_extern. Функции могут принимать аргументы, например: При необходимости могут быть созданы новые типы данных. Для перечислений можно создать тип от PostgresEnum, для структур данных нужно обеспечить сериализацию/десериализацию через serde. Для выполнения запросов к базе данных можно использовать возможности SPI (подключается из pgx::spi), например: Spi::run("запрос") выполняет запрос без результата; Spi::get_one("запрос") возвращает Result<Option<i64>, pgx::spi::Error> Spi::get_one_with_args("запрос", vec!([аргументы]) используется для подстановки значений вместо $1, $2 и т.д. в запросе; Spi::connect() возвращает клиента, через который могут выполняться запросы (select, insert и др.). Также можно использовать [pg_trigger] для создания функции для использования в триггере. (сама регистрация триггера выполняется через extension_sql!, например так: Также может быть создан фоновый процесс, в этом случае он должен быть добавлен как предзагруженная библиотека в postgresql.conf (shared_preload_library='bgw.so'), здесь в _PG_init() регистрируется и запускается фоновый процесс (также здесь может быть установлено разрешение на доступ к серверному API PostgreSQL через вызов enable_spi_access). Таким образом, можно реализовать собственную функциональность с использованием всех возможностей и библиотек Rust и подключить её к PostgreSQL как внешние функции и дополнительные типы данных, либо как фоновые обработчики. Также в pgx могут быть определены операторы, схемы данных, обработчики ошибок,  Для более подробного погружения в возможности библиотеки pgx можно использовать официальную документацию. Также хорошим местом для старта могут статьи примеры использования pgx в этом репозитории. В заключение статьи рекомендую всем желающим посетить открытый урок «Работа с геоданными в Postgres», который состоится сегодня вечером в OTUS. На нем участники рассмотрят основные операции с геоданными. Записаться можно по ссылке.  Flutter Developer@YandexPro, DevOps, IT Architect