2017-10-07 61 views
2

我想使用rusqlite的預準備語句。 Rusqlite實現性狀ToSqlString&stra bunch of other types無法調用rusqlite的查詢,因爲它需要類型&[&rusqlite :: types :: ToSql]

extern crate rusqlite; 

use rusqlite::Connection; 

fn main() { 
    let mut connection = Connection::open("C:\\test_db.db").unwrap(); 

    let mut cached_statement = connection 
     .prepare_cached("SELECT ?, ?, ? FROM test") 
     .unwrap(); 

    let vec_values = vec![ 
     &"test1".to_string(), 
     &"test2".to_string(), 
     &"test3".to_string(), 
    ]; 

    let rows = cached_statement.query(vec_values.as_slice()).unwrap(); 
} 

這並不與錯誤編譯:

error[E0308]: mismatched types 
    --> src/main.rs:18:39 
    | 
18 |  let rows = cached_statement.query(vec_values.as_slice()).unwrap(); 
    |          ^^^^^^^^^^^^^^^^^^^^^ expected trait rusqlite::types::ToSql, found struct `std::string::String` 
    | 
    = note: expected type `&[&rusqlite::types::ToSql]` 
       found type `&[&std::string::String]` 

回答

2

編譯器消息不騙你。你有一個&[&String]不是&[&ToSql]。 A 特質對象是與底層類型不同的類型,並且通常具有不同的大小;將值填充到向量中時,這兩者都是重要的考慮因素

另一個問題是,您無法創建String,請參考它,然後將其存儲在變量中。 String會立即解除分配,留下懸掛的引用,因此編譯器會阻止該引用。

你可以做最簡單的事情是創建一個新的Vec包含特質對象引用:

let vec_values = vec![ 
    "test1".to_string(), 
    "test2".to_string(), 
    "test3".to_string(), 
]; 

let query_values: Vec<_> = vec_values.iter().map(|x| x as &ToSql).collect(); 

let _rows = cached_statement.query(&query_values).unwrap(); 

complete example

或者,如果你想要一個過於通用的函數來執行轉換:

fn do_the_thing<'a, I, T: 'a>(things: I) -> Vec<&'a ToSql> 
where 
    I: IntoIterator<Item = &'a T>, 
    T: ToSql, 
{ 
    things 
     .into_iter() 
     .map(|x| x as &ToSql) 
     .collect() 
} 
let _rows = cached_statement.query(&do_the_thing(&vec_values)).unwrap(); 

complete example

+0

謝謝你的非常詳細的答案。這是行不通的,因爲「std :: convert :: From <&std :: string :: String>」沒有爲「rusqlite :: types :: ToSqlOutput <'_>」實現「我還沒有嘗試過通用解決方案,但是因爲它基本上相同的代碼應該會導致相同的錯誤。 (x爲&T​​oSql是問題) –

+0

@SlaterTh我不知道你的意思。我已發佈的兩段代碼都已成功編譯,現在我已添加指向整個可編譯示例的鏈接。我猜測我們中的一個人在沒有明確提及的情況下添加或刪除了某些內容。 – Shepmaster

+0

你的代碼確實是正確的,我用&vec中的字符串....謝謝你的時間。 –

相關問題