Tagebuch von Spargel

最近zennに移行しましたhttps://zenn.dev/spargel

rust sqlxで実行に影響ないエラーのハンドリング

環境

問題

rustでsqlx::query!を用いてSQL操作を行った際に,データベースからのエラーを返されることがある. デフォルトではpanicで動作終了するが, プログラム実行自体に影響ないエラーはスルーして続行させたいことがある.

その解決策のメモ

  • RowNotFound : (sqlx::query!は何かしら結果が返ってくることを期待するが,SQL文でCREATEなどを使用した場合はなにも返ってこないのでエラーを吐く)
  • MySqlDatabaseError (同じデータを登録しようとしたら起こるエラー.これを無視するかは要注意)

解決策

matchで取り扱う

#[tokio::main]
fn main(){
    //~~~~
    let pool = MySqlPoolOptions::new().max_connections(5).connect("DATABASE_URL").await.unwrap();
    let f = sqlx::query!("SQL文").fetch_one(&pool).await;

    //ここからが本題
    let _f = match f {
        Ok(_) => (),
        Err(error) => match error {
            sqlx::Error::RowNotFound => (),
            sqlx::Error::Database(_) => (),
            other_error => println!("{}", other_error),//想定外のエラーは何かしらの処理を書く(ここではエラー表示して続行)
        },
    };
}