我正在尝试将CSV数据插入到SQLite数据库中。stripe_id是可选的,因此它的类型是Option<&str>。所有其他字段均为&str。当我使用conn.execute插入值时,它们都正确插入,除了stripe_id,它抛出一个错误,说明它需要&str而不是Option。
我搜索了文档和Option<T>实现了ToSQL,当我尝试用包含Option值的Rusqlite示例替换我的代码时,它对示例代码抛出了相同的错误。
相关的结构和查询代码片段:
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(())
}发布于 2020-01-25 00:12:45
使用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(())
}https://stackoverflow.com/questions/59900003
复制相似问题