- 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
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.