Найти в Дзене
Цифровая Переплавка

PL/Rust: как Rust завоёвывает мир PostgreSQL

Когда-то язык Rust воспринимался главным образом как инструмент для системного программирования, а PostgreSQL славился своей гибкостью в плане поддерживаемых языков и расширений. Но что, если объединить высокую производительность и безопасность Rust с мощью реляционных баз данных? Именно этим и занимается проект PL/Rust — процедурный языковой обработчик для PostgreSQL, позволяющий писать функции на Rust с нативной компиляцией и богатой экосистемой библиотек. 🦀 Нативная компиляция
Функции на Rust в PL/Rust транслируются в машинный код, а не интерпретируются в рантайме. Для PostgreSQL это означает более высокую скорость исполнения запросов и минимум накладных расходов. 🛡 Безопасность на этапе компиляции
Rust знаменит своей «системой заимствования» и строгими проверками, которые помогают избегать целого класса ошибок (утечек памяти, гонок данных и т. п.). Это особенно важно в среде БД, где сбои могут приводить к потере данных. ⚙️ Прямой доступ к интерфейсу серверного программирования (S
Оглавление

Когда-то язык 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 на разных архитектурах.

Интересные факты и ссылки

Вот пример:

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 определённо стоит попробовать. Быть может, он станет вашим любимым языком для написания логики внутри базы данных.