環境
- Rust 1.69
- sqlx 0.6
- actix-web 4
概要
sqlxの0.7系が最近公開された。
バージョン上げてみたので、作業ログを残しておく。
アップデートするメリット
sqlx-data.jsonの廃止
sqlxでは query! のようなマクロを使ってクエリを書くと、マッピング型やSQLミスなどをチェックするためにビルド時にデータベースへ接続しにいって確認してくれる。エラーの場合はビルドエラーとなる。
CI時などは、直接データベースにつなぎにいくのは難しい(できなくはないが)ので、直接データベースつなぎにいくのではなく、クエリとテーブルの情報を sqlx-data.json のファイルに出力しておいて、データベースを直接参照できない場合は、自動的にそちらを参照しにいってくれる。
0.6系の場合は、このsqlx-data.jsonが1ファイルだったため、プロジェクト内の全クエリ(query!など)の内容がこのファイルに出力されてしまい、git上で激しく毎回コンフリクトを起こしている始末だった。
0.7では、このjsonファイルがクエリ毎にバラバラに .sqlxディレクトリに出力されるようになり、git上でコンフリクトする確率がグッと減った。
変更箇所
0.6 -> 0.7は破壊的な変更が入っているようで、単純に0.7にしてもビルドエラーとなった。
今回修正したところは以下となる。
全容は公式のChangeLogをみてください。
cargo.toml
sqlxのfeaturesに指定する項目名が変わった。
-
decimal->rust_decimal -
offline-> 指定する必要がない(デフォルトでサポートされる) -
runtime-actix-native-tls->tls-native-tls,runtime-tokioの2つになった
コードの変更
コネクション、トランザクション周りが変わったようでそのあたりでエラーになった。
とりあえずは &mut *tx や &mut tx のように渡していた箇所を &mut **txや tx.deref_mut()のように1つ今までより多くderefしてあげればビルドエラーが解消された。
.sqlxディレクトリの出力
$ cargo sqlx prepare --workspace
を実行する。
wsl環境ではdocker側で上記実行してもうまくいかなかった。
(しっかり検証していないが権限周りかもしれない)
動きました。
.sqlxディレクトリはgit管理に含めること
備考
地味にderefするやつが変更箇所がすごい多くて大変。