📝
RustでDBアクセスをsqlxにしてみた
目的
ユニークビジョン株式会社 Advent Calendar 2024のシリーズ2、12/7の記事です。
DBはPostgreSQLを使っていて、それにアクセスするためにcrate deadpool-postgresを使っていました。
さらにこれだけではrawすぎたので、一覧や一件を返すためのwrapperを作って使ってました。
sqlxはこれらをまとめてやってくれたので、こちらに乗り換えました。
説明
sqlx
READMEの機能を翻訳してみます。
- Native Rustなのでどこでもコンパイルできる
- 行をストリームで読み込める。非同期でデコードしてくれる(structにかな?)
- sqlx::queryを使うとprepareやcacheをコネクションごとにいい感じにやってくれる
- シンプルなクエリーの実行で行を同じ型で取得できる。バッチもサポートしてすべての結果を返せる
- TLSサポート
- 非同期通知であるPostgreSQLのLISTENとNOTIFYをサポート
- セーブポイントのためのネストしたトランザクション
- 色々なDBにランタイム時に変更できる。AnyPoolはURLスキーマーでドライバーを指定できる
型
利用できる型は別の記事に書いています。一部PostGIS関連の型のサポートが無いです。
実行方法
通常
以下の呼び出しが可能です。fetchシリーズは型を指定することでほしいものが得られます。
詳細は上記記事を見てください。
- execute 実行して影響があった行数を返す
- fetch_one 実行して1行返す。なければエラー
- fetch_optional 実行してOptionとして1行返す
- fetch_all 実行してすべての行を返す
ストリーム
データが大量にある場合はstreamを使います。
query_asでほしい型を指定できます。
let mut stream = sqlx::query_as::<_, Users>(SQL)
.bind("aaa")
.bind("bbb")
.fetch(pool);
while let Some(user) = stream.try_next().await? {
println!("{:?}", user);
}
その他
コンパイル時にSQLを確認する機能があります。rust-analyzerならエディタ上で指摘してくれます。実はあまり使ったこと無いです。SQLの部分はほとんど自動生成なので。
まとめ
sqlxはコネクションプールから、型変換、クエリーなど扱える便利なcrateです。基本的にPostgreSQLしか使わないので他のDBのサポートは気にしませんが、NotifyやListenなどPostgreSQLしか無い機能をサポートしてくれているので、安心して使えます。
Discussion
typo
rust-analyzer
typoの指摘ありがとうございます!