9 poin oleh xguru 2024-11-20 | 2 komentar | Bagikan ke WhatsApp
  • 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

 
secret3056 2024-11-20

Sepertinya pgrx adalah nama baru dari pgx.
Proyek serupa untuk sqlite adalah sqlite-loadable-rs.

 
xguru 2024-11-20

pglite-fusion - Menanamkan SQLite ke dalam tabel PostgreSQL Karena tertulis menggunakan pgrx di sana, saya jadi mencarinya.