Когда-то язык Rust воспринимался главным образом как инструмент для системного программирования, а PostgreSQL славился своей гибкостью в плане поддерживаемых языков и расширений. Но что, если объединить высокую производительность и безопасность Rust с мощью реляционных баз данных? Именно этим и занимается проект PL/Rust — процедурный языковой обработчик для PostgreSQL, позволяющий писать функции на Rust с нативной компиляцией и богатой экосистемой библиотек.
Чем PL/Rust может удивить
🦀 Нативная компиляция
Функции на Rust в PL/Rust транслируются в машинный код, а не интерпретируются в рантайме. Для PostgreSQL это означает более высокую скорость исполнения запросов и минимум накладных расходов.
🛡 Безопасность на этапе компиляции
Rust знаменит своей «системой заимствования» и строгими проверками, которые помогают избегать целого класса ошибок (утечек памяти, гонок данных и т. п.). Это особенно важно в среде БД, где сбои могут приводить к потере данных.
⚙️ Прямой доступ к интерфейсу серверного программирования (SPI)
PL/Rust не урезает функционал PostgreSQL — наоборот, предоставляет удобный доступ к интерфейсу серверного программирования (Server Programming Interface SPI), что позволяет динамически выполнять запросы, использовать подготовленные выражения, курсоры и многие другие фичи «из коробки».
🧰 Поддержка типов PostgreSQL
Неважно, нужно ли работать со строками (TEXT), числами (INT, BIGINT), JSONB или массивами — в PL/Rust предусмотрены удобные обёртки под большинство встроенных типов. Причём, если нужен триггер, его тоже можно написать на Rust!
Почему открытая разработка — это круто
PL/Rust распространяется под PostgreSQL License и доступен всем желающим на GitHub. Это открывает несколько заманчивых перспектив:
🔍 Прозрачность
Вы всегда можете заглянуть в исходники и увидеть, как реализована та или иная часть. Это особенно важно, если вы планируете использовать PL/Rust в продакшене и хотите понимать все риски.
🤝 Коллаборация
У разработчиков есть возможность вносить свой вклад: отправлять pull request'ы, предлагать улучшения, заводить задачи, обсуждать всё это на Discord-сервере проекта.
🚀 Быстрое развитие
Активное сообщество Rust-разработчиков способно довольно стремительно развивать инструментарий. Благодаря открытой модели разработки, новые фичи и улучшения появляются гораздо быстрее.
Личное мнение: чем хорош такой симбиоз
На мой взгляд, PL/Rust идеально отражает дух Rust — стремление к безопасной, но при этом максимально эффективной среде выполнения. PostgreSQL славится внушительным набором встроенных языков (C, PL/pgSQL, Python, Perl и т. д.), однако Rust выглядит особенно привлекательным за счёт:
- 🦾 Серьёзного уровня оптимизаций на этапе компиляции (LLVM-пайплайн).
- ✨ Высокого уровня абстракций — намного удобнее писать код, чем на C, при этом сохраняя производительность.
- 💼 Большой экосистемы (crates.io) — можно использовать готовые модули, например, для сериализации, криптографии, математических вычислений.
Если Rust уже внёс вклад в создание высоконагруженных сервисов и систем, то почему бы не применить его для написания PostgreSQL-функций и расширений? Мне кажется, это логичное развитие: мы получаем надёжную среду для PL/pgSQL-скриптов и новых модулей без боязни критических уязвимостей на уровне памяти.
Технические нюансы
⚙️ Доверенный (Trusted) vs. Недоверенный (Untrusted)
PL/Rust может работать как «доверенный» или «недоверенный» язык, в зависимости от платформы. Поддержка «trusted» пока реализована на Linux x86_64 и aarch64, но разработчики планируют расширять совместимость.
🐧 Сборка под Linux и Debian
Для быстрого старта на Debian доступны готовые пакеты. Если хочется настроить всё вручную, ничего не мешает собрать из исходников — достаточен установленный Rust (через rustup) и возможность собирать расширения.
🌍 Кросс-компиляция (Cross Compilation)
В репозитории есть инструкция по кросс-компиляции, что открывает путь к запуску PostgreSQL с PL/Rust на разных архитектурах.
Интересные факты и ссылки
- 🖥 PL/Rust построен на основе pgrx — фреймворка для разработки Postgres-расширений на Rust.
Вот пример:
CREATE FUNCTION add_two_numbers(a NUMERIC, b NUMERIC)
RETURNS NUMERIC STRICT LANGUAGE plrust AS $$
Ok(Some(a + b))
$$;
Данный кусок показывает, насколько лаконичным может быть Rust-код в PL/Rust: простая функция на сложение двух чисел, которая возвращает результат.
Заключение
PL/Rust — это ещё один яркий пример того, как язык Rust завоёвывает новые сферы применения. Благодаря высокому уровню безопасности, производительности и живому сообществу, расширения и функции для PostgreSQL могут выйти на качественно новый уровень. Для любителей Rust это возможность «запустить» любимый язык в ещё одной области, а для тех, кто ценит PostgreSQL — получить быстрые и безопасные функции вместо традиционного PL/pgSQL или Python.
Ссылки по теме:
Если вам близки идеи Rust и вы работаете с PostgreSQL, PL/Rust определённо стоит попробовать. Быть может, он станет вашим любимым языком для написания логики внутри базы данных.