- RustでPostgreSQL拡張を開発可能で、できる限りイディオマティックかつ安全であることを目指している
cargo-pgrx により完全に管理された開発環境を提供
cargo pgrx new: 新しい拡張を作成
cargo pgrx init: PostgreSQLのインストールを登録・管理
cargo pgrx run: 拡張を実行してテスト
cargo pgrx test: 複数のPostgreSQLバージョンでテスト
cargo pgrx package: 拡張のインストールパッケージを作成
- 複数のPostgreSQLバージョンをサポート
- PostgreSQL 12から17まで対応
- Rustのfeature gatingを通じてバージョン別APIを選択的に利用可能
- すべてのバージョンに対して統合テストが可能
- 自動スキーマ生成
- Rustだけで拡張を実装可能
- 多くのRustの型をPostgreSQL向けに自動マッピング
- SQLスキーマを自動生成するか、
cargo pgrx schema で手動生成可能
extension_sql! および extension_sql_file! マクロを通じてカスタムSQLを含めることが可能
- 安全性を最優先
- Rustの
panic! はPostgreSQLの ERROR に変換され、プロセスではなくトランザクションのみを中断
- Rustのメモリ管理モデルを維持 - panic! や elog(ERROR) でも同様
#[pg_guard] マクロによりRustとPostgreSQLの安定した連携をサポート
- Postgres
Datum は Option<T> where T: FromDatum
NULL Datum は安全に Option::<T>::None として表現される
- First-class UDF サポート
#[pg_extern] アノテーションによりRust関数(Postgresユーザー定義関数)をPostgreSQLに公開可能
#[pg_trigger] でトリガー関数を作成
- ユーザー定義型をサポート
#[derive(PostgresType)] によりRust構造体をPostgreSQL型として利用可能:
- メモリ上/ディスク上ではCBORでエンコードされ、人が読める形式ではJSONとして表現
- カスタムのメモリ/ディスク/JSON表現方式を定義可能
#[derive(PostgresEnum)] によりRustのEnumをPostgreSQL enumとして利用可能
pgrx::composite_type!("Sample") マクロを通じて複合型をサポート
- サーバープログラミングインターフェース(SPI)
- SPIに安全にアクセス可能
- SPIコンテキストで所有されたDatumを透過的に返却可能
- 高度な機能
pgrx::PgMemoryContexts を通じてPostgresのMemoryContextシステムに安全にアクセス
- Executor/planner/transaction/subtransaction フック
- Rustの
unsafe を用いて pgrx::pg_sys 経由でPostgreSQL内部機能にアクセス可能
- 制限事項と既知の問題
- マルチスレッド非対応: Postgresは基本的にシングルスレッドベースであり、スレッドがPostgres関数にアクセスするとクラッシュする可能性がある
- 非同期サポート未完成:
async コンテキストでのPostgresとの相互作用に関する研究が不足している
- Windowsサポート不足: 現在、Windowsでは完全には動作しない
- UTF-8エンコーディング必須: PostgresデータベースがUTF-8互換でない場合、エラーが発生する可能性がある
2件のコメント
pgrx は pgx から名前を変えたようですね。
似たプロジェクトとしては、sqlite の sqlite-loadable-rs があります。
pglite-fusion - PostgreSQLテーブルにSQLiteを埋め込む ここで pgrx を使っているとあったので調べてみました。