我需要null使用 rusqlite 将具有该值的字符串转换为 SQLite DB 中的实际空值。我无法控制这些字符串值。我找到了 Null 结构,但我不确定如何简洁地将它作为参数传递,但当它不是时使用字符串值null。
sqlite.execute(
"INSERT INTO people (name) VALUES (?1)",
params![
if person.name == "null" { &Null } else { person.name }
],
).unwrap();
Run Code Online (Sandbox Code Playgroud)
但我得到了错误
`if` and `else` have incompatible types
expected `&rusqlite::types::Null`, found struct `std::string::String`rustc(E0308)
Run Code Online (Sandbox Code Playgroud)
我可以做这样的事情,但必须有更好的方法。
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();
}
Run Code Online (Sandbox Code Playgroud)
我只能想象,在更现实的环境中,这样的事情会以多快的速度失去控制。是否有一些通用类型可以将字符串类型和 Null 结构转换为?完成插入后,我还可以进行 SQL 查询来替换所有这些值,但我宁愿第一次就做对。
我不熟悉rusqlite,但一般来说,Rust 中 \xe2\x80\x9c 的工具可能是 null\xe2\x80\x9d Option,并且看一下rusqlite::ToSql确认有一个
impl<T: ToSql> ToSql for Option<T>\nRun Code Online (Sandbox Code Playgroud)\n这就是你想要的。(不幸的是,它没有记录,但跟随 \xe2\x80\x9c[src]\xe2\x80\x9d 链接显示了它的实现。)要使用它:
\nif person.name == "null" { None } else { Some(person.name) }\nRun Code Online (Sandbox Code Playgroud)\n