0

我需要null使用 rusqlite 将具有该值的字符串转换为 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 查询来替换所有这些值,但我宁愿第一次就做对。

4

2 回答 2

3

我不熟悉rusqlite,但总的来说,Rust 中“可能为空”的工具是Option,并且看一下rusqlite::ToSql确认有一个

impl<T: ToSql> ToSql for Option<T>

哪个做你想要的。(不幸的是,它没有记录,但在“[src]”链接之后显示了它的实现。)使用它:

if person.name == "null" { None } else { Some(person.name) }
于 2022-01-23T04:06:35.467 回答
0

除了@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()
于 2022-01-23T07:29:15.800 回答