9 điểm bởi xguru 2024-11-20 | 2 bình luận | Chia sẻ qua WhatsApp
  • Có thể phát triển extension PostgreSQL bằng Rust, hướng tới tối đa tính idiomatic và an toàn
  • Hỗ trợ môi trường phát triển được quản lý hoàn toàn bằng cargo-pgrx
    • cargo pgrx new: tạo extension mới
    • cargo pgrx init: đăng ký và quản lý cài đặt PostgreSQL
    • cargo pgrx run: chạy và kiểm thử extension
    • cargo pgrx test: kiểm thử trên nhiều phiên bản PostgreSQL
    • cargo pgrx package: tạo gói cài đặt extension
  • Hỗ trợ nhiều phiên bản PostgreSQL
    • Hỗ trợ từ PostgreSQL 12 đến 17
    • Có thể dùng chọn lọc API theo từng phiên bản thông qua Rust feature gating
    • Có thể chạy kiểm thử tích hợp cho mọi phiên bản
  • Tự động tạo schema
    • Có thể triển khai extension chỉ bằng Rust
    • Tự động ánh xạ nhiều kiểu Rust sang PostgreSQL
    • Có thể tự động tạo SQL schema hoặc tạo thủ công bằng cargo pgrx schema
    • Có thể bao gồm SQL tùy chỉnh thông qua macro extension_sql!extension_sql_file!
  • Ưu tiên an toàn
    • panic! của Rust được chuyển thành PostgreSQL ERROR, nên chỉ transaction bị hủy chứ không làm dừng tiến trình
    • Giữ nguyên mô hình quản lý bộ nhớ của Rust - kể cả trong panic!elog(ERROR)
    • Macro #[pg_guard] hỗ trợ tích hợp ổn định giữa Rust và PostgreSQL
    • Datum của Postgres là Option<T> where T: FromDatum
    • NULL Datum được biểu diễn an toàn dưới dạng Option::<T>::None
  • Hỗ trợ UDF ở mức first-class
    • Có thể expose hàm Rust (hàm do người dùng định nghĩa trong Postgres) vào PostgreSQL bằng annotation #[pg_extern]
    • Tạo hàm trigger bằng #[pg_trigger]
  • Hỗ trợ kiểu do người dùng định nghĩa
    • Dùng #[derive(PostgresType)] để sử dụng struct Rust làm kiểu PostgreSQL:
      • Trong bộ nhớ/trên đĩa được mã hóa bằng CBOR, còn ở dạng con người đọc được thì biểu diễn bằng JSON
      • Có thể định nghĩa cách biểu diễn tùy chỉnh cho bộ nhớ/đĩa/JSON
      • Dùng #[derive(PostgresEnum)] để sử dụng Rust enum làm PostgreSQL enum:
      • Hỗ trợ kiểu phức hợp thông qua macro pgrx::composite_type!("Sample")
  • Giao diện lập trình phía máy chủ (SPI)
    • Có thể truy cập SPI một cách an toàn
    • Có thể trả về minh bạch Datum được sở hữu trong ngữ cảnh SPI
  • Tính năng nâng cao
    • Truy cập an toàn vào hệ thống MemoryContext của Postgres qua pgrx::PgMemoryContexts
    • Hook cho executor/planner/transaction/subtransaction
    • Có thể dùng unsafe của Rust để truy cập tính năng nội bộ của PostgreSQL thông qua pgrx::pg_sys
  • Giới hạn và vấn đề đã biết
    • Không hỗ trợ đa luồng: Postgres về cơ bản hoạt động theo mô hình đơn luồng, và thread có thể bị crash nếu truy cập vào hàm Postgres
    • Hỗ trợ bất đồng bộ chưa hoàn thiện: Chưa có nhiều nghiên cứu về tương tác với Postgres trong ngữ cảnh async
    • Hỗ trợ Windows còn hạn chế: Hiện chưa hoạt động hoàn chỉnh trên Windows
    • Bắt buộc mã hóa UTF-8: Có thể phát sinh lỗi nếu cơ sở dữ liệu Postgres không tương thích UTF-8

2 bình luận

 
secret3056 2024-11-20

Có vẻ như pgrx là tên được đổi từ pgx.
Một dự án tương tự là sqlite-loadable-rs của sqlite.

 
xguru 2024-11-20

pglite-fusion - Nhúng SQLite vào bảng PostgreSQL Thấy họ nói dùng pgrx ở đây nên tôi đã tìm thử.