如何在Rust中从MySQL查询结果提取NaiveDate和NaiveTime值?
解决MySQL查询结果中NaiveDate/NaiveTime的FromValue未实现错误
问题原因
mysql crate默认未为chrono库的NaiveDate和NaiveTime类型实现FromValue trait,直接通过row.get::<NaiveDate, _>()提取会触发编译错误。
解决方案
步骤1:启用mysql crate的chrono特性
先在Cargo.toml中为mysql依赖添加chrono特性,让库自动为chrono的日期时间类型实现必要的转换trait:
[dependencies] mysql = { version = "24.0", features = ["chrono"] } chrono = "0.4"
步骤2:正确提取并序列化日期时间
启用特性后即可直接通过row.get提取NaiveDate和NaiveTime;如果仍有问题,可手动转换mysql的原始值:
use chrono::{NaiveDate, NaiveTime}; use mysql::{Row, Value}; use serde_json::json; // 假设conn和stmt已初始化 let results: Vec<Row> = conn.exec( &stmt, params! { "date" => date }, )?; let mut events = Vec::new(); for row in results { // 提取日期 let date = match row.get::<Value, _>("date") { Ok(Value::Date(y, m, d)) => NaiveDate::from_ymd_opt(y as i32, m, d).unwrap_or_default(), _ => NaiveDate::default(), }; // 提取时间 let time = match row.get::<Value, _>("time") { Ok(Value::Time(h, min, s, micro, _)) => NaiveTime::from_hms_micro_opt(h, min, s, micro).unwrap_or_default(), _ => NaiveTime::default(), }; let event = json!({ "event_id": row.get::<String, _>("event_uuid").unwrap_or_default(), "date": date, "time": time, }); events.push(event); }
补充说明
- 若使用旧版本mysql crate,特性名称可能有差异,可对应查阅版本文档。
unwrap_or_default()在提取失败时返回对应类型的默认值(如NaiveDate默认值为0001-01-01),可根据业务需求替换为更合适的错误处理逻辑。
内容的提问来源于stack exchange,提问作者M3KTREFE
相关产品推荐
相关产品推荐

