9 पॉइंट द्वारा xguru 2024-11-20 | 2 टिप्पणियां | WhatsApp पर शेयर करें
  • 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 टिप्पणियां

 
secret3056 2024-11-20

लगता है pgrx का नाम pgx से बदला गया है।
इसी तरह के प्रोजेक्ट्स में sqlite का sqlite-loadable-rs भी है।

 
xguru 2024-11-20

pglite-fusion - PostgreSQL टेबल में SQLite एम्बेड करना में देखा कि वहाँ pgrx का इस्तेमाल किया गया था, इसलिए मैंने इसे खोजकर देखा।