用 "null" 值替换字符串作为真正的空值 rusqlite
Replace strings with "null" value as real null values rusqlite
我需要使用 rusqlite 将 null
值的字符串转换为 SQLite 数据库中的实际空值。我无法控制这些字符串值。我找到了 Null 结构,但我不确定如何简洁地将它作为参数传递,但是当它不是 null
.
时使用字符串值
sqlite.execute(
"INSERT INTO people (name) VALUES (?1)",
params![
if person.name == "null" { &Null } else { person.name }
],
).unwrap();
但是我得到了错误
`if` and `else` have incompatible types
expected `&rusqlite::types::Null`, found struct `std::string::String`rustc(E0308)
我可以做这样的事情,但必须有更好的方法。
if person.name == "null" {
sqlite.execute(
"INSERT INTO people (name) VALUES (?1)",
params![
&Null
],
).unwrap();
} else {
sqlite.execute(
"INSERT INTO people (name) VALUES (?1)",
params![
person.name
],
).unwrap();
}
我只能想象在更现实的环境中,这样的事情会以多快的速度失去对多个值的控制。是否有一些通用类型可以将字符串类型和 Null 结构转换为?我也可以在完成插入后进行 SQL 查询以替换所有这些值,但我更愿意第一次就做对。
我不熟悉 rusqlite
,但一般来说,Rust 中“可能为空”的工具是 Option
,查看 rusqlite::ToSql
确认有一个
impl<T: ToSql> ToSql for Option<T>
哪个做你想做的。 (不幸的是,它没有记录,但在“[src]”之后 link 显示了它的实现。)使用它:
if person.name == "null" { None } else { Some(person.name) }
除了@KevinReid 所说的,params![]
宏将所有值转换为 &dyn ToSql
。所以,一种方法是使用 dyn ToSql
:
sqlite
.execute(
"INSERT INTO people (name) VALUES (?1)",
params![
if person.name == "null" { &Null as &dyn ToSql } else { &person.name },
],
)
.unwrap()
我需要使用 rusqlite 将 null
值的字符串转换为 SQLite 数据库中的实际空值。我无法控制这些字符串值。我找到了 Null 结构,但我不确定如何简洁地将它作为参数传递,但是当它不是 null
.
sqlite.execute(
"INSERT INTO people (name) VALUES (?1)",
params![
if person.name == "null" { &Null } else { person.name }
],
).unwrap();
但是我得到了错误
`if` and `else` have incompatible types
expected `&rusqlite::types::Null`, found struct `std::string::String`rustc(E0308)
我可以做这样的事情,但必须有更好的方法。
if person.name == "null" {
sqlite.execute(
"INSERT INTO people (name) VALUES (?1)",
params![
&Null
],
).unwrap();
} else {
sqlite.execute(
"INSERT INTO people (name) VALUES (?1)",
params![
person.name
],
).unwrap();
}
我只能想象在更现实的环境中,这样的事情会以多快的速度失去对多个值的控制。是否有一些通用类型可以将字符串类型和 Null 结构转换为?我也可以在完成插入后进行 SQL 查询以替换所有这些值,但我更愿意第一次就做对。
我不熟悉 rusqlite
,但一般来说,Rust 中“可能为空”的工具是 Option
,查看 rusqlite::ToSql
确认有一个
impl<T: ToSql> ToSql for Option<T>
哪个做你想做的。 (不幸的是,它没有记录,但在“[src]”之后 link 显示了它的实现。)使用它:
if person.name == "null" { None } else { Some(person.name) }
除了@KevinReid 所说的,params![]
宏将所有值转换为 &dyn ToSql
。所以,一种方法是使用 dyn ToSql
:
sqlite
.execute(
"INSERT INTO people (name) VALUES (?1)",
params![
if person.name == "null" { &Null as &dyn ToSql } else { &person.name },
],
)
.unwrap()