pgrx - Un framework pour développer des extensions PostgreSQL en Rust
(github.com/pgcentralfoundation)- 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-pgrxcargo pgrx new: crée une nouvelle extensioncargo pgrx init: enregistre et gère les installations PostgreSQLcargo pgrx run: exécute et teste l’extensioncargo pgrx test: teste sur plusieurs versions de PostgreSQLcargo 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!etextension_sql_file!
- Priorité à la sécurité
- Les
panic!de Rust sont traduits enERRORPostgreSQL, 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!etelog(ERROR) - La macro
#[pg_guard]permet une interopérabilité fiable entre Rust et PostgreSQL - Les
DatumPostgres sont représentés parOption<T> where T: FromDatum - Un
DatumNULLest représenté en toute sécurité parOption::<T>::None
- Les
- 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
- L’annotation
- 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
MemoryContextde Postgres viapgrx::PgMemoryContexts - Hooks executor/planner/transaction/subtransaction
- Accès aux fonctionnalités internes de PostgreSQL via
pgrx::pg_sysen utilisant leunsafede Rust
- Accès sûr au système
- 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
asyncrestent 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.