- Rust से PostgreSQL एक्सटेंशन डेवलप किए जा सकते हैं, और इसे यथासंभव idiomatic और safe बनाने की कोशिश की गई है
cargo-pgrx के साथ पूरी तरह managed development environment का समर्थन
cargo pgrx new: नया एक्सटेंशन बनाना
cargo pgrx init: PostgreSQL इंस्टॉलेशन का रजिस्ट्रेशन और प्रबंधन
cargo pgrx run: एक्सटेंशन चलाना और टेस्ट करना
cargo pgrx test: कई PostgreSQL वर्ज़न पर टेस्ट करना
cargo pgrx package: एक्सटेंशन इंस्टॉलेशन पैकेज बनाना
- कई PostgreSQL वर्ज़न का समर्थन
- PostgreSQL 12 से 17 तक समर्थन
- Rust feature gating के जरिए वर्ज़न-विशिष्ट API का चयनात्मक उपयोग संभव
- सभी वर्ज़न के लिए integration test संभव
- ऑटोमैटिक schema generation
- सिर्फ Rust से एक्सटेंशन इम्प्लीमेंट करना संभव
- कई Rust types को PostgreSQL के लिए अपने-आप मैप किया जाता है
- SQL schema को अपने-आप generate किया जा सकता है या
cargo pgrx schema से manually generate किया जा सकता है
extension_sql! और extension_sql_file! macros के जरिए custom SQL शामिल किया जा सकता है
- safety को प्राथमिकता
- Rust का
panic! PostgreSQL ERROR में translate हो जाता है, जिससे process नहीं बल्कि सिर्फ transaction abort होता है
- Rust का memory management model बना रहता है -
panic! और elog(ERROR) में भी
#[pg_guard] macro के जरिए Rust और PostgreSQL के बीच stable integration का समर्थन
- Postgres
Datum को Option<T> where T: FromDatum के रूप में हैंडल किया जाता है
NULL Datum को सुरक्षित रूप से Option::<T>::None के रूप में व्यक्त किया जाता है
- First-class UDF support
#[pg_extern] annotation के जरिए Rust functions (Postgres user-defined functions) को PostgreSQL में expose किया जा सकता है
#[pg_trigger] से trigger functions बनाए जा सकते हैं
- user-defined types का समर्थन
#[derive(PostgresType)] से Rust struct को PostgreSQL type के रूप में इस्तेमाल किया जा सकता है:
- मेमोरी/डिस्क पर यह CBOR में encode होता है, और human-readable रूप में JSON के तौर पर व्यक्त होता है
- custom memory/disk/JSON representation को define किया जा सकता है
#[derive(PostgresEnum)] से Rust Enum को PostgreSQL enum के रूप में इस्तेमाल किया जा सकता है
pgrx::composite_type!("Sample") macro के जरिए composite type का समर्थन
- Server Programming Interface (SPI)
- SPI तक सुरक्षित रूप से पहुंचा जा सकता है
- SPI context में owned Datum को transparently return किया जा सकता है
- advanced features
pgrx::PgMemoryContexts के जरिए Postgres के MemoryContext सिस्टम तक सुरक्षित access
- Executor/planner/transaction/subtransaction hooks
- Rust के
unsafe का उपयोग करके pgrx::pg_sys के जरिए PostgreSQL internal features तक पहुंच
- सीमाएँ और ज्ञात समस्याएँ
- multithreading का समर्थन नहीं: Postgres मूल रूप से single-threaded है, और अगर thread Postgres functions तक पहुंचें तो crash हो सकता है
- async support अधूरा:
async context में Postgres के साथ interaction पर पर्याप्त शोध नहीं है
- Windows support सीमित: फिलहाल Windows पर यह पूरी तरह काम नहीं करता
- UTF-8 encoding अनिवार्य: अगर Postgres database UTF-8 संगत नहीं है तो error हो सकता है
2 टिप्पणियां
लगता है pgrx का नाम pgx से बदला गया है।
इसी तरह के प्रोजेक्ट्स में sqlite का sqlite-loadable-rs भी है।
pglite-fusion - PostgreSQL टेबल में SQLite एम्बेड करना में देखा कि वहाँ pgrx का इस्तेमाल किया गया था, इसलिए मैंने इसे खोजकर देखा।