首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将字符串替换为“空”值,作为实空值rusqlite

将字符串替换为“空”值,作为实空值rusqlite
EN

Stack Overflow用户
提问于 2022-01-23 02:39:41
回答 2查看 425关注 0票数 2

我需要使用rusqlite将具有null值的字符串转换为SQLite DB中的实际空值。我不能控制这些字符串值。我已经找到了Null结构,但我不知道如何简洁地将它作为参数传递,但当它不是null时,则使用字符串值。

代码语言:javascript
复制
sqlite.execute(
    "INSERT INTO people (name) VALUES (?1)",
    params![
        if person.name == "null" { &Null } else { person.name }
    ],
).unwrap();

但我明白错误

代码语言:javascript
复制
`if` and `else` have incompatible types

expected `&rusqlite::types::Null`, found struct `std::string::String`rustc(E0308)

我可以做这样的事,但必须有更好的方法。

代码语言:javascript
复制
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查询来替换所有这些值,但是我更愿意在第一次正确地使用它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-23 04:06:35

我不熟悉rusqlite,但总的来说,在锈蚀中“可能为空”的工具是Option,查看rusqlite::ToSql可以确认

代码语言:javascript
复制
impl<T: ToSql> ToSql for Option<T>

做你想做的事。(不幸的是,它没有文档化,但是下面的“src”链接显示了它的实现。)使用它:

代码语言:javascript
复制
if person.name == "null" { None } else { Some(person.name) }
票数 5
EN

Stack Overflow用户

发布于 2022-01-23 07:29:15

除了@KevinReid所说的,params![]宏将所有值转换为&dyn ToSql。因此,一种方法是使用dyn ToSql

代码语言:javascript
复制
sqlite
        .execute(
            "INSERT INTO people (name) VALUES (?1)",
            params![
                if person.name == "null" { &Null as &dyn ToSql } else { &person.name },
            ],
        )
        .unwrap()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70818742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档