🦀

【Rust】SELECTしたデータの特定のカラムを値が空文字orNullの場合のみアクションさせる

2024/10/12に公開

この記事を書くにあたって

Rustで自作アプリを作っている際、データベースから取得してきたデータの中で特定のカラムにデータがないとき(空文字orNull)にのみ別の処理をさせる(一般的にNullチェックと言われているような)プログラムを実装しましたが、想定より難しかったため、今後似たような実装をするときのために簡単な手順書として残しておきたいと思ったのでここに書き留めておきます。

この記事で説明しないこと

  • DBからのSELECT処理
  • インポート文

実演

データベース、エンティティ確認

DBから取得するデータは以下になります。

今回は、画像内のレコードすべてを取得し、「remark」カラムがNullまたは空文字の場合のみ、「staff_name」の値をベクタに詰めるプログラムを作りたいと思います。
 ※上から二行目の「remark」にはNull、四つ目には空文字が入っています。

使用するエンティティは以下のようになっています。

//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15

use sea_orm::entity::prelude::*;

#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)]
#[sea_orm(table_name = "staffs")]
pub struct Model {
   #[sea_orm(primary_key)]
   pub id: i32,
   pub staff_name: Option<String>,
   pub department_id: Option<i32>,
   #[sea_orm(column_name = "Joining_date")]
   pub joining_date: Option<Date>,
   pub remark: Option<String>,
}
~~~~以下略~~~~

※id以外はOption型です。

ソースコード

is_empty()メソッドを使います。

pub async  fn select_null_check()  {
    let db = DbInfo::new().await;//DB接続情報

    //SELECTする
    let result_select:Vec<staffs::Model>
        = select_staff(&db.get_db_con()).await.expect("database select error!");

    //スタッフ名を詰めるためのベクタ
    let mut staff_list:Vec<String> = Vec::new();

    //取得したデータを一行ずつ取り出す
    for staff in &result_select{

        if let Some(str) = staff.remark.clone() {

            //「remark」が空文字orNullだったら「staff_name」をベクタに詰める
            if !str.is_empty() {
                staff_list.push(staff.staff_name.clone().unwrap());
            }
        }
    }

    //詰め込んだスタッフ名を出力
    println!("備考欄に記載があるスタッフ:{:?}", staff_list);
}

結果

Discussion