如何使用 rusqlite 的 Row::get 方法来处理我在编译时不知道的类型?



我正在使用Rust的rusqlite机箱从sqlite数据库中插入和调用数据。

我对返回Result<T>Row使用get()方法。我有这个当前的代码片段:

while let Some(row) = rows.next()? {
let value = match row.get(0).expect("Could not get value from database cell.") {
// Do something here to specify types and return them or add them to a separate collection
};
}

如何指定类型?目前,我可以正确打开get函数的唯一方法是将其分配给已经具有特定类型的变量,如let value: i64 = row.get(0).unwrap(),但我不知道如何区分get(0)实际上是字符串、布尔值还是任何其他可接受的SQL类型。

我已经搜索了matchResult的其他示例,但它们的匹配枚举是基于值而不是类型的。

如何指定类型?目前,我可以正确打开get函数的唯一方法是将其分配给已经具有特定类型的变量,如let value: i64 = row.get(0).unwrap()

如果我正确理解您想要什么,您正在寻找返回ValueRef枚举的get_rawget_raw_checked。通过这种方式,您可以在运行时检查检索到的值的类型:

while let Some(row) = rows.next()? {
let value = match row.get_raw(0) {
ValueRef::Null => ...
ValueRef::Integer(i) => ...
ValueRef::Real(f) => ...
ValueRef::Text(t) => ...
ValueRef::Blob(b) => ...
}
}

get表示一个期望值,如果期望值被背叛,则返回Err,因为通常你知道存储在列中的值的类型应该是什么,如果有人在你下面替换了列或值的类型,那么一切都会被破坏。它还可以方便地处理各种转换,因此您不必手动处理它们。

顺便说一句,如果你不想处理get可能出现的错误,你可以使用它的兄弟get_unwrap

Result<T>上的T来自表方案,因此T的类型将由数据库而不是Rust确定。

通常,一个好的做法是创建一个struct,像文档中的示例一样映射SQL表。

SQLite侧

CREATE TABLE person (
id              INTEGER PRIMARY KEY,
name            TEXT NOT NULL,
time_created    TEXT NOT NULL,
data            BLOB
)

锈蚀侧

#[derive(Debug)]
struct Person {
id: i32,
name: String,
time_created: Timespec,
data: Option<Vec<u8>>,
}

相关内容

最新更新