9 points par xguru 2024-11-20 | 2 commentaires | Partager sur WhatsApp
  • 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

 
secret3056 2024-11-20

Il semble que pgrx soit le nouveau nom de pgx.
Parmi les projets similaires, il y a sqlite-loadable-rs pour SQLite.

 
xguru 2024-11-20

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.