我正在使用Rust的rusqlite机箱来插入和回收来自sqlite数据库的数据。
我正在为其返回一个get()的Row使用Result<T>方法。我有一个当前的代码片段:
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)实际上是字符串还是布尔型,或者任何其他可接受的get(0)类型。
我已经搜索过match和Result的其他示例,但是它们的匹配枚举是基于值的,而不是类型。
发布于 2020-02-25 14:39:32
如何指定类型?目前,我能够正确地展开get函数的唯一方法是将它赋值给一个已经具有特定类型的变量,比如
let value: i64 = row.get(0).unwrap()。
如果我正确理解了您想要的内容,您将查找返回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即可。
发布于 2020-02-25 14:40:31
您的Result<T>上的Result<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>>,
}https://stackoverflow.com/questions/60396593
复制相似问题