首页 > 解决方案 > 如何将 rusqlite 的 Row::get 方法用于编译时我不知道的类型?

问题描述

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

我正在使用返回 a的get()方法。我有这个当前的代码片段:RowResult<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)实际上是字符串还是布尔值或任何其他可接受的 SQL 类型。

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

标签: sqlrust

解决方案


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

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

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

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


推荐阅读