0

我有一个接收 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()
    }
}
4

1 回答 1

0

查看您链接错误的示例是不Rc直接传递:

.query_map(rusqlite::params![vec![values]], |row| {

对比

.query_map([values], |row| {
于 2021-09-12T08:27:15.280 回答