9 คะแนน โดย xguru 2024-11-20 | 2 ความคิดเห็น | แชร์ทาง WhatsApp
  • สามารถพัฒนา PostgreSQL extension ด้วย Rust โดยพยายามให้มีความเป็น idiomatic และปลอดภัยมากที่สุด
  • รองรับสภาพแวดล้อมการพัฒนาที่จัดการแบบครบวงจรด้วย cargo-pgrx
    • cargo pgrx new: สร้าง extension ใหม่
    • cargo pgrx init: ลงทะเบียนและจัดการการติดตั้ง PostgreSQL
    • cargo pgrx run: รันและทดสอบ extension
    • cargo pgrx test: ทดสอบบน PostgreSQL หลายเวอร์ชัน
    • cargo pgrx package: สร้างแพ็กเกจสำหรับติดตั้ง extension
  • รองรับ PostgreSQL หลายเวอร์ชัน
    • รองรับตั้งแต่ PostgreSQL 12 ถึง 17
    • สามารถเลือกใช้ API ตามเวอร์ชันได้ผ่าน Rust feature gating
    • สามารถทำ integration test ได้กับทุกเวอร์ชัน
  • การสร้างสคีมาอัตโนมัติ
    • สามารถพัฒนา extension ได้ด้วย Rust เพียงอย่างเดียว
    • แมป Rust type จำนวนมากให้ใช้กับ PostgreSQL ได้โดยอัตโนมัติ
    • สร้าง SQL schema อัตโนมัติได้ หรือสร้างเองแบบแมนนวลด้วย cargo pgrx schema
    • สามารถใส่ SQL แบบกำหนดเองได้ผ่านแมโคร extension_sql! และ extension_sql_file!
  • ให้ความสำคัญกับความปลอดภัยเป็นอันดับแรก
    • panic! ของ Rust จะถูกแปลงเป็น PostgreSQL ERROR ทำให้ยกเลิกเฉพาะทรานแซกชัน ไม่ใช่ทั้งโปรเซส
    • คงโมเดลการจัดการหน่วยความจำของ Rust ไว้ แม้ในกรณี panic! และ elog(ERROR)
    • รองรับการเชื่อมต่อระหว่าง Rust และ PostgreSQL อย่างปลอดภัยด้วยแมโคร #[pg_guard]
    • Postgres Datum ใช้เป็น Option<T> where T: FromDatum
    • NULL Datum จะถูกแทนอย่างปลอดภัยด้วย Option::<T>::None
  • รองรับ UDF แบบ first-class
    • สามารถเปิดเผยฟังก์ชัน Rust (Postgres user-defined function) ให้ PostgreSQL ใช้งานได้ด้วยแอนโนเทชัน #[pg_extern]
    • สร้าง trigger function ได้ด้วย #[pg_trigger]
  • รองรับชนิดข้อมูลที่ผู้ใช้กำหนดเอง
    • ใช้ #[derive(PostgresType)] เพื่อให้ Rust struct เป็น PostgreSQL type ได้:
      • ในหน่วยความจำ/บนดิสก์จะถูกเข้ารหัสเป็น CBOR และแสดงผลแบบที่มนุษย์อ่านได้เป็น JSON
      • สามารถกำหนดรูปแบบการแทนค่าในหน่วยความจำ/บนดิสก์/JSON เองได้
      • ใช้ #[derive(PostgresEnum)] เพื่อให้ Rust enum เป็น PostgreSQL enum ได้
      • รองรับ composite type ผ่านแมโคร pgrx::composite_type!("Sample")
  • Server Programming Interface (SPI)
    • เข้าถึง SPI ได้อย่างปลอดภัย
    • สามารถคืนค่า Datum ที่เป็น ownership ใน SPI context ได้อย่างโปร่งใส
  • ความสามารถขั้นสูง
    • เข้าถึงระบบ MemoryContext ของ Postgres ได้อย่างปลอดภัยผ่าน pgrx::PgMemoryContexts
    • มี hook สำหรับ executor/planner/transaction/subtransaction
    • สามารถเข้าถึงความสามารถภายในของ PostgreSQL ผ่าน pgrx::pg_sys โดยใช้ unsafe ของ Rust
  • ข้อจำกัดและปัญหาที่ทราบแล้ว
    • ไม่รองรับมัลติเธรด: โดยพื้นฐานแล้ว Postgres ทำงานแบบ single-thread และอาจเกิดการชนกันได้หากเธรดเข้าถึงฟังก์ชันของ Postgres
    • การรองรับ asynchronous ยังไม่สมบูรณ์: ยังมีการศึกษาน้อยเกี่ยวกับการโต้ตอบกับ Postgres ในบริบท async
    • รองรับ Windows ได้ไม่ดี: ปัจจุบันยังทำงานได้ไม่สมบูรณ์บน Windows
    • ต้องใช้การเข้ารหัส UTF-8: หากฐานข้อมูล Postgres ไม่รองรับ UTF-8 อาจเกิดข้อผิดพลาดได้

2 ความคิดเห็น

 
secret3056 2024-11-20

ดูเหมือนว่า pgrx จะเป็นชื่อใหม่ของ pgx
โปรเจ็กต์ที่คล้ายกันคือ sqlite-loadable-rs ของ sqlite

 
xguru 2024-11-20

pglite-fusion - ฝัง SQLite ลงในตาราง PostgreSQL เห็นว่าเขาใช้ pgrx ที่นี่ ก็เลยลองไปค้นหาดูครับ