let ids: Vec<i32> = get_ids(); //get_ids impl elsewhere
let stmt = db_conn.prepare(
"SELECT id, name, created FROM person
WHERE id = ANY( $1 )").unwrap();
let mut iter = stmt.query(
[&ids]).unwrap();
这会导致错误:
error: failed to find an implementation of trait postgres::types::ToSql for collections::vec::Vec<i32>
根据 the documentation ,
这意味着我需要将其转换为 types::array::ArrayBase<Option<i32>>
.
我该怎么做?
到目前为止我最好的尝试是:
let idOptions: Vec<Option<i32>> = ids.iter().map( |i| Some(i) ).collect();
let idsForDb: postgres::types::array::ArrayBase<Option<i32>> =
postgres::types::array::ArrayBase::from_vec(idOptions, 0);
let mut iter = stmt.query(
[&idsForDb]).unwrap();
结果是:
error: expected core::iter::FromIterator<core::option::Option<&i32>>, but found core::iter::FromIterator<core::option::Option<i32>> (expected i32 but found &-ptr) [E0095]
最佳答案
技巧在于在 map |i| 的闭包函数中取消引用指针一些(*i)
:
let idOptions: Vec<Option<i32>> = ids.iter().map( |i| Some(*i) ).collect();
let idsForDb: postgres::types::array::ArrayBase<Option<i32>> =
postgres::types::array::ArrayBase::from_vec(idOptions, 0);
let mut iter = stmt.query(
[&idsForDb]).unwrap();
我会将答案奖励给能够找到更优雅/惯用的方法的人。
关于postgresql - 如何将 Vec<i32> 转换为 types::array::ArrayBase<Option<i32>> 用于 rust-postgres?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25184213/