簡體   English   中英

如何轉換Vec <i32> 到類型:: array :: ArrayBase <Option<i32> &gt;對於銹postgres?

[英]How to convert Vec<i32> to types::array::ArrayBase<Option<i32>> for rust-postgres?

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>

根據文檔 ,這意味着我需要將其轉換為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]

該技巧在於在映射|i| Some(*i)的閉包函數中取消對指針的引用|i| Some(*i) |i| Some(*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();

我會將答案授予能夠找到更優雅/慣用的方法的人。

嘗試使用ArrayBase::from_rawArrayBase::from_vec 它們都有文檔記錄-您可以閱讀源代碼或使用rustdoc構建文檔。

https://github.com/sfackler/rust-postgres/blob/master/src/types/array.rs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM