pgrx – Ein Framework zur Entwicklung von PostgreSQL-Erweiterungen mit Rust
(github.com/pgcentralfoundation)- 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-pgrxcargo pgrx new: neue Erweiterung erstellencargo pgrx init: PostgreSQL-Installationen registrieren und verwaltencargo pgrx run: Erweiterung ausführen und testencargo pgrx test: auf mehreren PostgreSQL-Versionen testencargo 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 schemageneriert werden - Benutzerdefiniertes SQL kann über die Makros
extension_sql!undextension_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!undelog(ERROR) - Das Makro
#[pg_guard]unterstützt die sichere Anbindung zwischen Rust und PostgreSQL - Postgres-
DatumistOption<T> where T: FromDatum NULL-Datum wird sicher alsOption::<T>::Nonedargestellt
- Rust-
- 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
- Mit der Annotation
- 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")
- Mit
- 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_sysunter Nutzung von Rust-unsafe
- Sicherer Zugriff auf das MemoryContext-System von Postgres über
- 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
Es sieht so aus, als hätte pgrx seinen Namen von pgx geändert.
Ein ähnliches Projekt ist sqlite-loadable-rs für SQLite.
Ich habe danach gesucht, weil dort stand, dass pglite-fusion - SQLite in PostgreSQL-Tabellen einbetten pgrx verwendet wurde.