pgrx - Framework phát triển extension PostgreSQL bằng Rust
(github.com/pgcentralfoundation)- 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-pgrxcargo pgrx new: tạo extension mớicargo pgrx init: đăng ký và quản lý cài đặt PostgreSQLcargo pgrx run: chạy và kiểm thử extensioncargo pgrx test: kiểm thử trên nhiều phiên bản PostgreSQLcargo 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 PostgreSQLERROR, 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 Datumcủa Postgres làOption<T> where T: FromDatumNULLDatum được biểu diễn an toàn dưới dạngOption::<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]
- Có thể expose hàm Rust (hàm do người dùng định nghĩa trong Postgres) vào PostgreSQL bằng annotation
- 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")
- Dùng
- 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
unsafecủa Rust để truy cập tính năng nội bộ của PostgreSQL thông quapgrx::pg_sys
- Truy cập an toàn vào hệ thống MemoryContext của Postgres qua
- 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ử.