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::Datetime
とNaiveDateTime
になるよう設定することでコンパイルがはまって上手く動作します。