首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对编译时不知道的类型使用rusqlite::get方法?

如何对编译时不知道的类型使用rusqlite::get方法?
EN

Stack Overflow用户
提问于 2020-02-25 14:13:12
回答 2查看 1.5K关注 0票数 1

我正在使用Rust的rusqlite机箱来插入和回收来自sqlite数据库的数据。

我正在为其返回一个get()Row使用Result<T>方法。我有一个当前的代码片段:

代码语言:javascript
复制
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)类型。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-25 14:39:32

如何指定类型?目前,我能够正确地展开get函数的唯一方法是将它赋值给一个已经具有特定类型的变量,比如let value: i64 = row.get(0).unwrap()

如果我正确理解了您想要的内容,您将查找返回get_rawget_raw_checked枚举,这样您就可以在运行时检查检索到的值是什么类型:

代码语言:javascript
复制
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即可。

票数 3
EN

Stack Overflow用户

发布于 2020-02-25 14:40:31

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

通常,一个很好的做法是创建一个struct来映射您的SQL表,就像在关于文档的示例中一样。

SQLite侧

代码语言:javascript
复制
CREATE TABLE person (
    id              INTEGER PRIMARY KEY,
    name            TEXT NOT NULL,
    time_created    TEXT NOT NULL,
    data            BLOB
)

锈蚀侧

代码语言:javascript
复制
#[derive(Debug)]
struct Person {
    id: i32,
    name: String,
    time_created: Timespec,
    data: Option<Vec<u8>>,
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60396593

复制
相关文章

相似问题

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