首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有"InvalidColumnType(0,空)“和恐慌的Rusqlite查询

带有"InvalidColumnType(0,空)“和恐慌的Rusqlite查询
EN

Stack Overflow用户
提问于 2017-03-17 17:46:43
回答 1查看 1.4K关注 0票数 3

我有一个工作密码:

代码语言:javascript
复制
extern crate rusqlite;

use rusqlite::Connection;

fn main() {
    let conn = Connection::open("db.sqlite").unwrap();

    conn.execute("CREATE TABLE toto (size INTEGER NOT NULL DEFAULT 0);", &[]).unwrap();
    conn.execute("INSERT INTO toto(size) VALUES (42);", &[]).unwrap();

    let filter = 0;
    let i: i64 = conn.query_row("SELECT SUM(size) FROM toto", &[], |r| r.get(0)).unwrap();
    println!("Coucou");
    println!("Coucou: {}", i);
}

但如果我换了

代码语言:javascript
复制
"SELECT SUM(size) FROM toto", &[]

代码语言:javascript
复制
"SELECT SUM(size) FROM toto WHERE size=?1", &[&filter]

再来一次,这让人惊慌:

代码语言:javascript
复制
rm db.sqlite
RUST_BACKTRACE=1 cargo run
代码语言:javascript
复制
        Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
         Running `target/debug/testsqlite`
    thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: InvalidColumnType(0, Null)', /checkout/src/libcore/result.rs:860

如果我在sqliteman中执行这个查询,它可以工作,那么为什么rusqlite会恐慌呢?

EN

回答 1

Stack Overflow用户

发布于 2017-03-17 18:26:19

如果我直接在sqlite命令行实用程序中运行查询,则没有值,结果是NULL

代码语言:javascript
复制
sqlite> SELECT SUM(size) FROM toto WHERE size=42;

sqlite> SELECT coalesce(SUM(size), 'NULL!') FROM toto WHERE size=42;
NULL!
sqlite>

由于没有与where子句匹配的行,所以和为空。

如果没有非空输入行,则sum()返回NULL,而total()返回0.0。

您的NULL结果不能转换为i64,因此您将得到一个错误:

InvalidColumnType(0, Null)

如果打印出该错误,它会显示相同的内容:

代码语言:javascript
复制
let i: i64 = conn.query_row("SELECT SUM(size) FROM toto WHERE size = ?1", &[&filter], |r| {
    match r.get_checked(0) {
        Ok(v) => v,
        Err(e) => panic!("query_row error: {}", e),
    }
}).expect("select failed");

query_row错误:索引为0的无效列类型为Null

修整它的锈边

如果通过使用NULL更新代码以说明Option,它将正确执行:

代码语言:javascript
复制
let i: Option<i64> = conn.query_row(
    "SELECT SUM(size) FROM toto WHERE size = ?1",
    &[&filter],
    |r| r.get(0)
).expect("select failed");

然后,您可以使用i.unwrap_or(0)

TOTAL修复它

代码语言:javascript
复制
let i: f64 = conn.query_row(
    "SELECT TOTAL(size) FROM toto WHERE size = ?1",
    &[&filter],
    |r| r.get(0)
).expect("select failed");

注意,我们切换到了一个f64

COALESCE修复它

代码语言:javascript
复制
let i: i64 = conn.query_row(
    "SELECT COALESCE(SUM(size), 0) FROM toto WHERE size = ?1",
    &[&filter],
    |r| r.get(0)
).expect("select failed");
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42864066

复制
相关文章

相似问题

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