uiuifree.com

- サイト制作のノウハウと最適化を目指して-

2022.4.18【Rust】MySQLからDatetime型のデータを取得する方法

【Rust】MySQLからDatetime型のデータを取得する方法

前提

Rustを使ってMySQLの接続をしていただけなのに何故かSELECT構文でエラーを吐き続け苦戦した。やりたいことはString(文字型)に日時を入れたいだけなのに全く入らず半日以上苦戦していた。

対応方法

元々はRustのMySQLライブラリを使って実装しようとしていましたが、全く上手くいかずdieselを使う方法に切り替えました。

created_atはdatetime型で実装

fn example(){
        let database_url = "mysql://localhost:3306/database_name";
        let manager = ConnectionManager::<MysqlConnection>::new(database_url);
        let con = manager.connect().unwrap();
        let res = sql_query("SELECT created_at FROM hogehoge").load(&con);
        if res.is_err() {
            println!("{}", res.err().unwrap());
        } else {
            let data: Vec<Test> = res.unwrap();
            println!("{:?}", data);
        }
}

#[derive(Debug)]
struct Test {
    created_at: String,
}
impl QueryableByName<diesel::mysql::Mysql> for Test {
    fn build<R: diesel::row::NamedRow<diesel::mysql::Mysql>>(
        row: &R,
    ) -> diesel::deserialize::Result<Self> {
        let mut test = Test {
            created_at: "".to_string(),
        };

        let created_at = row.get::<diesel::mysql::types::Datetime, _>("created_at");
        if created_at.is_err() {
            println!("error {:?}", created_at.err().unwrap())
        } else {
            let created_at: NaiveDateTime = created_at.unwrap();
            println!("show {:?}", created_at);
            test.created_at = created_at.to_string();
        }
        Ok(test)
    }
}

ポイントとしてはMySQLから取得する時の型をdiesel::mysql::types::DatetimeNaiveDateTimeになるよう設定することでコンパイルがはまって上手く動作します。

目次
PROFILE

このサイトを運営してるuiuifreeです。
渋谷のベンチャー企業で2年ほど新規事業を担当した後にフリーランスエンジニアにキャリア転換。
求人サイトの開発が多くエンジニア/看護師/保育士などの分野でサイトを運営しています。

アウトプット中の技術

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)