Rust中如何将mysql::value::Value转换为f64、i32等其他数据类型
解决方案
方法1:使用Row内置的get方法(最推荐)
你使用的Rust MySQL库的Row类型自带类型转换能力,不需要手动处理Bytes类型,直接通过get方法指定目标类型即可:
conn.query_iter("select * from TheForm") .unwrap() .for_each(|row_result| { let row = row_result.unwrap().unwrap(); // 按索引取字段,直接指定要转换的目标类型 let id: u64 = row.get(0).unwrap(); let value1: f64 = row.get(1).unwrap(); let value2: f64 = row.get(2).unwrap(); let str_value: String = row.get(3).unwrap(); println!("id: {}, value1: {}, str_value: {}", id, value1, str_value); });
你也可以按字段名取,避免索引顺序记错的问题:
let id: u64 = row.get("id").unwrap();
方法2:手动转换Bytes类型
如果你确实拿到了Bytes实例需要自行转换,可按以下方式处理:Bytes类型实现了AsRef<[u8]> trait,可以先拿到字节切片再转目标类型:
- 转String:
let bytes = row.get::<mysql::Bytes, _>(0).unwrap(); let str_val = String::from_utf8(bytes.as_ref().to_vec()).unwrap(); // 如果允许非UTF8字符,可用损失转换: let str_val_lossy = String::from_utf8_lossy(bytes.as_ref()).to_string();
- 转f64:
let bytes = row.get::<mysql::Bytes, _>(1).unwrap(); let float_val: f64 = String::from_utf8_lossy(bytes.as_ref()).parse().unwrap();
进阶用法:直接映射为结构体
开启MySQL库的derive功能后,可以通过派生宏直接把整行数据映射为结构体实例,代码更易维护:
- 首先修改Cargo.toml依赖开启feature:
mysql = { version = "24.0", features = ["derive"] }
- 定义对应表结构的结构体:
use mysql::prelude::FromRow; #[derive(Debug, FromRow)] struct TheForm { id: u64, value1: f64, value2: f64, value3: f64, value4: f64, value5: f64, }
- 遍历直接转换:
conn.query_iter("select * from TheForm") .unwrap() .for_each(|row_result| { let row = row_result.unwrap().unwrap(); let form_data = TheForm::from_row(row); println!("{:?}", form_data); });
注意事项
- 目标类型要和数据库字段类型兼容,否则转换会失败,实际项目不要直接用
unwrap,需做好错误处理。 - 如果数据库字段允许为NULL,要把目标类型设置为
Option<T>,比如let value: Option<f64> = row.get(1).unwrap();。
内容的提问来源于stack exchange,提问作者Lee Alex
相关产品推荐
相关产品推荐

