我需要使用rusqlite将值为null
的字符串转换为SQLite DB中的实际空值。我无法控制这些字符串值。我找到了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中"可能为null"的工具是Option
,查看rusqlite::ToSql
可以确认存在
impl<T: ToSql> ToSql for Option<T>
这就是你想要的。(不幸的是,它没有文档记录,但在"[src]"链接后面显示了它的实现。(使用它:
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()