9 Punkte von xguru 2024-11-20 | 2 Kommentare | Auf WhatsApp teilen
  • Entwicklung von PostgreSQL-Erweiterungen mit Rust möglich, mit dem Ziel, so idiomatisch und sicher wie möglich zu sein
  • Unterstützung für eine vollständig verwaltete Entwicklungsumgebung mit cargo-pgrx
    • cargo pgrx new: neue Erweiterung erstellen
    • cargo pgrx init: PostgreSQL-Installationen registrieren und verwalten
    • cargo pgrx run: Erweiterung ausführen und testen
    • cargo pgrx test: auf mehreren PostgreSQL-Versionen testen
    • cargo pgrx package: Installationspaket für die Erweiterung erstellen
  • Unterstützung für mehrere PostgreSQL-Versionen
    • Unterstützung von PostgreSQL 12 bis 17
    • Versionsspezifische APIs können über Rust-Feature-Gating selektiv verwendet werden
    • Integrationstests für alle Versionen möglich
  • Automatische Schema-Erzeugung
    • Implementierung der Erweiterung allein mit Rust möglich
    • Viele Rust-Typen werden automatisch für PostgreSQL gemappt
    • SQL-Schema kann automatisch erzeugt oder manuell mit cargo pgrx schema generiert werden
    • Benutzerdefiniertes SQL kann über die Makros extension_sql! und extension_sql_file! eingebunden werden
  • Sicherheit an erster Stelle
    • Rust-panic! wird in PostgreSQL-ERROR übersetzt, sodass nur die Transaktion und nicht der Prozess abgebrochen wird
    • Das Rust-Speicherverwaltungsmodell bleibt erhalten – auch bei panic! und elog(ERROR)
    • Das Makro #[pg_guard] unterstützt die sichere Anbindung zwischen Rust und PostgreSQL
    • Postgres-Datum ist Option<T> where T: FromDatum
    • NULL-Datum wird sicher als Option::<T>::None dargestellt
  • First-class-Unterstützung für UDFs
    • Mit der Annotation #[pg_extern] können Rust-Funktionen (benutzerdefinierte Postgres-Funktionen) in PostgreSQL verfügbar gemacht werden
    • Mit #[pg_trigger] können Trigger-Funktionen erstellt werden
  • Unterstützung für benutzerdefinierte Typen
    • Mit #[derive(PostgresType)] können Rust-Strukturen als PostgreSQL-Typen verwendet werden:
      • Im Speicher und auf der Platte werden sie als CBOR kodiert, in menschenlesbarer Form als JSON dargestellt
      • Benutzerdefinierte Darstellungen für Speicher/Platte/JSON können definiert werden
      • Mit #[derive(PostgresEnum)] können Rust-Enums als PostgreSQL-Enums verwendet werden
      • Unterstützung für zusammengesetzte Typen über das Makro pgrx::composite_type!("Sample")
  • Server Programming Interface (SPI)
    • Sicherer Zugriff auf SPI möglich
    • Im SPI-Kontext besessene Datums können transparent zurückgegeben werden
  • Erweiterte Funktionen
    • Sicherer Zugriff auf das MemoryContext-System von Postgres über pgrx::PgMemoryContexts
    • Hooks für Executor/Planner/Transaction/Subtransaction
    • Zugriff auf interne PostgreSQL-Funktionen über pgrx::pg_sys unter Nutzung von Rust-unsafe
  • Einschränkungen und bekannte Probleme
    • Keine Multithreading-Unterstützung: Postgres basiert grundsätzlich auf einem Single-Thread-Modell; wenn Threads auf Postgres-Funktionen zugreifen, kann es zu Abstürzen kommen
    • Asynchrone Unterstützung unvollständig: Die Interaktion mit Postgres im async-Kontext ist bislang unzureichend erforscht
    • Eingeschränkte Windows-Unterstützung: Funktioniert derzeit unter Windows nicht vollständig
    • UTF-8-Kodierung erforderlich: Wenn die Postgres-Datenbank nicht UTF-8-kompatibel ist, können Fehler auftreten

2 Kommentare

 
secret3056 2024-11-20

Es sieht so aus, als hätte pgrx seinen Namen von pgx geändert.
Ein ähnliches Projekt ist sqlite-loadable-rs für SQLite.

 
xguru 2024-11-20

Ich habe danach gesucht, weil dort stand, dass pglite-fusion - SQLite in PostgreSQL-Tabellen einbetten pgrx verwendet wurde.