📝

RustでDBアクセスをsqlxにしてみた

2024/12/17に公開
2

目的

ユニークビジョン株式会社 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関連の型のサポートが無いです。

RustでSQLxで扱えるPostgreSQLの型について

実行方法

通常

以下の呼び出しが可能です。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

kanaruskanarus

typo

rust-analizerならエディタ上で指摘してくれます

rust-analyzer

など便利な扱えるcrateです

  • など扱える便利なcrateです
  • など便利に扱えるcrateです