pgrx - Rust से PostgreSQL एक्सटेंशन डेवलप करने का फ्रेमवर्क
(github.com/pgcentralfoundation)- 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!PostgreSQLERRORमें 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के रूप में हैंडल किया जाता है NULLDatum को सुरक्षित रूप सेOption::<T>::Noneके रूप में व्यक्त किया जाता है
- Rust का
- 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 अधूरा:
asynccontext में 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 का इस्तेमाल किया गया था, इसलिए मैंने इसे खोजकर देखा।