gpt4 book ai didi

sqlite - 带有 SUM 的 Rusqlite 查询出现 "InvalidColumnType(0, Null)" panic

转载 作者:行者123 更新时间:2023-11-29 08:10:16 25 4
gpt4 key购买 nike

我有这个工作代码:

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);
}

但如果我切换

"SELECT SUM(size) FROM toto", &[]

"SELECT SUM(size) FROM toto WHERE size=?1", &[&filter]

然后重新运行,它会崩溃:

rm db.sqlite
RUST_BACKTRACE=1 cargo run
        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 会崩溃?

最佳答案

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

sqlite> SELECT SUM(size) FROM toto WHERE size=42;

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

因为没有匹配 where 子句的行,the sum is NULL :

If there are no non-NULL input rows then sum() returns NULL but total() returns 0.0

您的 NULL 结果无法转换为 i64,因此您会收到错误消息:

InvalidColumnType(0, Null)

如果你打印出那个错误,它会说同样的事情:

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 error: Invalid column type Null at index: 0

在 Rust 端修复它

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

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 修复它的 SQL 端

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

请注意,我们切换到了 f64

使用 COALESCE 在 SQL 端修复它

let i: i64 = conn.query_row(
"SELECT COALESCE(SUM(size), 0) FROM toto WHERE size = ?1",
&[&filter],
|r| r.get(0)
).expect("select failed");

关于sqlite - 带有 SUM 的 Rusqlite 查询出现 "InvalidColumnType(0, Null)" panic ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42864066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com