- 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! và 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! và 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
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.
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ử.