我有一个接收 id 列表然后从数据库中选择它们的函数。我正在传递一个 Vec,我发现了这个问题https://github.com/rusqlite/rusqlite/issues/430链接到这里https://github.com/rusqlite/rusqlite/blob/master/src/vtab /array.rs#L18它说 // 注意:Rc<Vec<Value>>
必须使用 A 作为参数。
我无法弄清楚如何将此 Vec 转换为 Rc<Vec> 是一种不会产生编译错误的方法。我尝试了以下方法:
let values = std::rc::Rc::new(ids.into_iter().copied().map(String::from).collect::<Vec<String>>());
let values = std::rc::Rc::from(ids.into_iter().map(|item| item.to_string()).collect::<Vec<String>>());
let values = std::rc::Rc::from(&ids);
这部分的一些变体 Vec<Rc<Vecstd::string::String>> 全部 3 给出了相同的错误
the trait bound `Vec<Rc<Vec<std::string::String>>>: ToSql` is not satisfied the following implementations were found: <Vec<u8> as ToSql> required for the cast to the object type `dyn ToSql`
我怎样才能将它转换为 Rc<Vec> 而不是 Vec<Rc<Vec>>
我的代码在这里
fn table_data_to_table(ids: &Vec<String>) -> Vec<data::Item> {
let db_connection = rusqlite::Connection::open("data.sqlite")
.expect("Cannot connect to database.");
let values = std::rc::Rc::new(ids.into_iter().copied().map(String::from).collect::<Vec<String>>());
let mut statement = db_connection
.prepare("select * from item where id in rarray(?);")
.expect("Failed to prepare query.");
let mut results = statement
.query_map(rusqlite::params![vec![values]], |row| {
Ok(database::ItemData {
id: row.get(0)?,
name: row.get(1)?,
time_tp_prepare: row.get(2)?
})
});
match results {
Ok(rows) => {
let collection: rusqlite::Result<Vec<database::ItemData>> = rows.collect();
match collection {
Ok(items) => {
items.iter().map(|item_data| data::Item {
id: item_data.id,
name: item_data.name,
time_to_prepare: item_data.time_tp_prepare
}).collect()
},
Err(_) => Vec::new(),
}
},
Err(_) => Vec::new()
}
}