- Dapat mengembangkan ekstensi PostgreSQL dengan Rust, dengan upaya agar sebisa mungkin idiomatis & aman
- Mendukung lingkungan pengembangan yang dikelola sepenuhnya dengan
cargo-pgrx
cargo pgrx new: membuat ekstensi baru
cargo pgrx init: mendaftarkan dan mengelola instalasi PostgreSQL
cargo pgrx run: menjalankan dan menguji ekstensi
cargo pgrx test: menguji di beberapa versi PostgreSQL
cargo pgrx package: membuat paket instalasi ekstensi
- Mendukung banyak versi PostgreSQL
- Mendukung PostgreSQL 12 hingga 17
- API per versi dapat digunakan secara selektif melalui Rust feature gating
- Pengujian integrasi dapat dilakukan untuk semua versi
- Pembuatan skema otomatis
- Ekstensi dapat diimplementasikan hanya dengan Rust
- Banyak tipe Rust dipetakan secara otomatis untuk PostgreSQL
- Skema SQL dapat dibuat otomatis atau dibuat manual dengan
cargo pgrx schema
- SQL kustom dapat disertakan melalui makro
extension_sql! dan extension_sql_file!
- Mengutamakan keamanan
panic! di Rust diterjemahkan menjadi PostgreSQL ERROR, sehingga hanya transaksi yang dibatalkan, bukan prosesnya
- Model manajemen memori Rust tetap dipertahankan, termasuk saat
panic! dan elog(ERROR)
- Makro
#[pg_guard] mendukung integrasi yang stabil antara Rust dan PostgreSQL
- Postgres
Datum direpresentasikan sebagai Option<T> where T: FromDatum
NULL Datum direpresentasikan secara aman sebagai Option::<T>::None
- Dukungan UDF kelas satu
- Dengan anotasi
#[pg_extern], fungsi Rust (fungsi yang ditentukan pengguna di Postgres) dapat diekspos ke PostgreSQL
#[pg_trigger] untuk membuat fungsi trigger
- Mendukung tipe yang ditentukan pengguna
- Dengan
#[derive(PostgresType)], struct Rust dapat digunakan sebagai tipe PostgreSQL:
- Di memori/disk dikodekan sebagai CBOR, dan dalam bentuk yang dapat dibaca manusia direpresentasikan sebagai JSON
- Dapat mendefinisikan format representasi kustom untuk memori/disk/JSON
- Dengan
#[derive(PostgresEnum)], Rust Enum dapat digunakan sebagai enum PostgreSQL
- Mendukung tipe komposit melalui makro
pgrx::composite_type!("Sample")
- Server Programming Interface (SPI)
- Dapat mengakses SPI dengan aman
- Dapat mengembalikan Datum yang dimiliki dalam konteks SPI secara transparan
- Fitur lanjutan
- Akses aman ke sistem MemoryContext milik Postgres melalui
pgrx::PgMemoryContexts
- Hook executor/planner/transaction/subtransaction
- Dapat mengakses fitur internal PostgreSQL melalui
pgrx::pg_sys dengan memanfaatkan unsafe di Rust
- Batasan dan masalah yang diketahui
- Tidak mendukung multithreading: Postgres pada dasarnya berbasis single-thread, dan jika thread mengakses fungsi Postgres dapat menyebabkan crash
- Dukungan asinkron belum matang: penelitian tentang interaksi dengan Postgres dalam konteks
async masih kurang
- Dukungan Windows masih kurang: saat ini belum berfungsi sempurna di Windows
- Wajib encoding UTF-8: jika database Postgres tidak kompatibel dengan UTF-8, error dapat terjadi
2 komentar
Sepertinya pgrx adalah nama baru dari pgx.
Proyek serupa untuk sqlite adalah sqlite-loadable-rs.
pglite-fusion - Menanamkan SQLite ke dalam tabel PostgreSQL Karena tertulis menggunakan pgrx di sana, saya jadi mencarinya.