将字符串替换为"null"值作为实际空值 rusqlite



我需要使用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()

最新更新