others - 橄欖石 - 在執行查詢時,為什麼Rusqlite拒絕Option類型?

我嘗試將CSV數據插入SQLite資料庫,stripe_id類型是Option其他所有欄位都是&str,當我使用conn.execute插入值時,它們都正確插入stripe_id,但這將引發一個錯誤,指出需要

相關的結構和查詢代碼段:


struct Merchant<'a> {


 name: &'a str,


 billing_portal: &'a str,


 billing_period: &'a str,


 stripe_id: Option<&'a str>,


}




conn.execute(


"INSERT INTO merchants (name, billing_portal, billing_period, stripe_id)


 values (?, ?, ?, ?)",


 &[&merch.name, &merch.billing_portal, &merch.billing_period, &merch.stripe_id]


).expect("Error inserting merchant into database");



錯誤:


error[E0308]: mismatched types


 --> src/main.rs:38:75


 |


38 | &[&merch.name, &merch.billing_portal, &merch.billing_period, &merch.stripe_id]


 | ^^^^^^^^^^^^^^^^ expected `&str`, found enum `std::option::Option`


 |


 = note: expected reference `&&str`


 found reference `&std::option::Option<&str>`



和完整的代碼:


extern crate csv;


extern crate rusqlite;



use rusqlite::{Connection, Result};



#[derive(Debug)]


struct Merchant<'a> {


 name: &'a str,


 billing_portal: &'a str,


 billing_period: &'a str,


 stripe_id: Option<&'a str>,


}



fn main() -> Result<()> {


 let conn = Connection::open("data.sqlite")?;



 let mut reader = csv::ReaderBuilder::new()


 .has_headers(false)


 .from_path("merchants.csv")


 .expect("Failed to read csv");


 for record in reader.records() {


 let record = record.unwrap();


 let merch = Merchant {


 name: &record[0],


 billing_portal: &record[3],


 billing_period: &record[4],


 stripe_id: (match &record[5] {


 x if x =="" => None,


 x => Some(x)


 }),


 };


 println!("{:?}", &merch);



 conn.execute(


"INSERT INTO merchants (name, billing_portal, billing_period, stripe_id)


 values (?, ?, ?, ?)",


 &[&merch.name, &merch.billing_portal, &merch.billing_period, &merch.stripe_id]


 ).expect("Error inserting merchant into database");



 }



 Ok(())


}



时间: 原作者:

使用rusqlite::params宏可以解決問題:


use rusqlite::{params, Connection, Result};



fn main() -> Result<()> {


 // ...



 for record in reader.records() {


 // ...



 conn.execute(


"INSERT INTO merchants (name, billing_portal, billing_period, stripe_id)


 values (?, ?, ?, ?)",


 params![


 &merch.name,


 &merch.billing_portal,


 &merch.billing_period,


 &merch.stripe_id,


 ],


 )


 .expect("Error inserting merchant into database");


 }



 Ok(())


}



原作者:
...