我需要使用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();
}我只能想象,在一个更现实的环境中,像这样的东西会有多大的价值失控。我是否可以将字符串类型和空结构转换为通用类型?在插入完所有这些值之后,我还可以创建一个SQL查询来替换所有这些值,但是我更愿意在第一次正确地使用它。
发布于 2022-01-23 04:06:35
我不熟悉rusqlite,但总的来说,在锈蚀中“可能为空”的工具是Option,查看rusqlite::ToSql可以确认
impl<T: ToSql> ToSql for Option<T>做你想做的事。(不幸的是,它没有文档化,但是下面的“src”链接显示了它的实现。)使用它:
if person.name == "null" { None } else { Some(person.name) }发布于 2022-01-23 07:29:15
除了@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()https://stackoverflow.com/questions/70818742
复制相似问题