pgrx - RustでPostgreSQL拡張を開発するためのフレームワーク
(github.com/pgcentralfoundation)- 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 NULLDatum は安全にOption::<T>::Noneとして表現される
- Rustの
- 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 を使っているとあったので調べてみました。