- Permet de développer des extensions PostgreSQL en Rust, avec un effort maximal pour rester idiomatique et sûr
- Fournit un environnement de développement entièrement géré avec
cargo-pgrx
cargo pgrx new : crée une nouvelle extension
cargo pgrx init : enregistre et gère les installations PostgreSQL
cargo pgrx run : exécute et teste l’extension
cargo pgrx test : teste sur plusieurs versions de PostgreSQL
cargo pgrx package : crée un paquet d’installation de l’extension
- Prise en charge de plusieurs versions de PostgreSQL
- Compatible de PostgreSQL 12 à 17
- Permet d’utiliser sélectivement des API selon la version via le feature gating de Rust
- Possibilité d’exécuter des tests d’intégration sur toutes les versions
- Génération automatique du schéma
- Permet d’implémenter une extension uniquement en Rust
- Mappe automatiquement de nombreux types Rust vers PostgreSQL
- Le schéma SQL peut être généré automatiquement ou manuellement avec
cargo pgrx schema
- Possibilité d’inclure du SQL personnalisé via les macros
extension_sql! et extension_sql_file!
- Priorité à la sécurité
- Les
panic! de Rust sont traduits en ERROR PostgreSQL, ce qui interrompt uniquement la transaction et non le processus
- Le modèle de gestion mémoire de Rust est préservé, y compris lors de
panic! et elog(ERROR)
- La macro
#[pg_guard] permet une interopérabilité fiable entre Rust et PostgreSQL
- Les
Datum Postgres sont représentés par Option<T> where T: FromDatum
- Un
Datum NULL est représenté en toute sécurité par Option::<T>::None
- Prise en charge de premier plan des UDF
- L’annotation
#[pg_extern] permet d’exposer des fonctions Rust (fonctions utilisateur PostgreSQL) dans PostgreSQL
#[pg_trigger] permet de créer des fonctions de déclencheur
- Prise en charge des types personnalisés
#[derive(PostgresType)] permet d’utiliser une structure Rust comme type PostgreSQL :
- en mémoire/sur disque, elle est encodée en CBOR et représentée en JSON dans un format lisible par l’humain
- possibilité de définir des représentations personnalisées en mémoire, sur disque et en JSON
#[derive(PostgresEnum)] permet d’utiliser un enum Rust comme enum PostgreSQL
- Prise en charge des types composites via la macro
pgrx::composite_type!("Sample")
- Interface de programmation serveur (SPI)
- Accès sûr au SPI
- Possibilité de retourner de manière transparente des Datum possédés dans le contexte SPI
- Fonctionnalités avancées
- Accès sûr au système
MemoryContext de Postgres via pgrx::PgMemoryContexts
- Hooks executor/planner/transaction/subtransaction
- Accès aux fonctionnalités internes de PostgreSQL via
pgrx::pg_sys en utilisant le unsafe de Rust
- Limites et problèmes connus
- Multithreading non pris en charge : Postgres repose fondamentalement sur un modèle mono-thread, et un thread accédant à des fonctions Postgres peut provoquer des collisions
- Support asynchrone incomplet : les recherches sur l’interaction avec Postgres dans un contexte
async restent insuffisantes
- Support Windows limité : ne fonctionne pas encore parfaitement sous Windows
- Encodage UTF-8 obligatoire : des erreurs peuvent survenir si la base de données Postgres n’est pas compatible UTF-8
2 commentaires
Il semble que pgrx soit le nouveau nom de pgx.
Parmi les projets similaires, il y a sqlite-loadable-rs pour SQLite.
Comme il était indiqué que pglite-fusion - intégrer SQLite dans des tables PostgreSQL utilisait pgrx, je suis allé voir de quoi il s’agissait.