rusqlite中如何将Vec<Value>作为查询参数?ToSql trait未实现报错如何解决?
问题原因
- 你直接传递了
Rc<Vec<rusqlite::types::Value>>作为SQL查询参数,但rusqlite默认没有为Vec<Value>实现ToSqltrait,rarray虚拟表要求使用官方提供的专用包装类型传递数组参数。 - 你大概率没有在Cargo.toml中开启rusqlite的
arrayfeature,该feature才会提供rarray相关的类型和实现。
解决步骤
- 首先修改Cargo.toml中的rusqlite依赖,开启array特性:
rusqlite = { version = "你当前使用的版本号", features = ["array"] }
- 修改代码中的数组包装逻辑,用官方提供的
Array类型包裹你的值数组,替换自行封装的Rc:
let int_values: Vec<i64> = ids.into_iter().map(|s| s.parse::<i64>().expect("Id Parse error.")).collect(); let values: Vec<rusqlite::types::Value> = int_values.into_iter().map(rusqlite::types::Value::from).collect(); // 替换原来的Rc封装,用官方专用Array类型 let arr = rusqlite::vtab::array::Array::from(values); let mut statement = db_connection .prepare("select * from item where id in rarray(?);") .expect("Failed to prepare second query."); let results = statement // 直接传&arr作为参数即可 .query_map(&[&arr], |row| { Ok(database::ItemData { id: row.get(0)?, name: row.get(1)?, time_to_prepare: row.get(2)? }) });
原理说明
rusqlite::vtab::array::Array是官方专为rarray虚拟表实现的参数类型,已经内置了ToSql trait实现,能正确将Rust数组转换为SQLite可识别的rarray参数格式,你之前自行封装的Rc<Vec>没有对应的trait实现,因此会触发编译报错。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

