- สามารถพัฒนา 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 ความคิดเห็น
ดูเหมือนว่า pgrx จะเป็นชื่อใหม่ของ pgx
โปรเจ็กต์ที่คล้ายกันคือ sqlite-loadable-rs ของ sqlite
pglite-fusion - ฝัง SQLite ลงในตาราง PostgreSQL เห็นว่าเขาใช้ pgrx ที่นี่ ก็เลยลองไปค้นหาดูครับ