我正在使用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类型。
我已经搜索了match
和Result
的其他示例,但它们的匹配枚举是基于值而不是类型的。
如何指定类型?目前,我可以正确打开get函数的唯一方法是将其分配给已经具有特定类型的变量,如
let value: i64 = row.get(0).unwrap()
如果我正确理解您想要什么,您正在寻找返回ValueRef
枚举的get_raw
和get_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>>,
}