原因
SQLを解析している最中に、UUIDと文字列を比較・代入している箇所が発見されている。
※SQLを実行してエラーになっているわけではない。
参考コード
sqlx::query_as::<_, SubscriptionRow>(
"SELECT * FROM subscriptions WHERE user_id = $1 AND id = $2",
)
.bind(&user_id.value) // String型(テーブルはUUID)
.bind(&subscription_id.value) // String型(テーブルはUUID)
.fetch_one(pool)
.await
上記のコードのような場合、実行時に実行前のSQLチェック段階でエラーになる。
下記のように修正するとエラーが解消される。
"SELECT * FROM subscriptions WHERE user_id = $1::uuid AND id = $2::uuid"
ひとこと
以下の理由で原因を探すのがかなり大変でした。
- コンパイルエラーは発生しない
- SQL自体は実行可能
- エラーメッセージの情報が少ない
- sqlx自体の情報が少ない