sql - 如何将 rusqlite 的 Row::get 方法用于编译时我不知道的类型?
问题描述
我正在使用 Rust 的rusqlite
crate 从 sqlite 数据库中插入和调用数据。
我正在使用返回 a的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)
实际上是字符串还是布尔值或任何其他可接受的 SQL 类型。
我搜索了match
with的其他示例Result
,但它们的匹配枚举基于值,而不是类型。
解决方案
我怎么能指定类型?目前,我可以正确解开 get 函数的唯一方法是将其分配给已经具有特定类型的变量,例如
let value: i64 = row.get(0).unwrap()
如果我正确理解了您想要的内容,那么您正在寻找get_raw
并以get_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
。
推荐阅读
- arduino - 如何让 LED 每 n 秒闪烁一次而不会产生延迟?
- javascript - 在javascript中多次使用onChange函数
- php - 如何检查同一ID在另一列中有多个值?
- c# - MVVM DialogService 替代品
- java - 在 Cucumber 胶水选项包中使用多个类
- python - txt 中的分割线。然后附加到两个列表。使列表翻倍
- angular - 当从 Angular 文档下载项目并运行 ng serve -o 项目定义时找不到
- pandas - 将带有日期列的 pyspark DataFrame 转换为 Pandas 会导致 AttributeError
- python - 如何在 Python 中同时录制音频和视频?
- laravel - gcloud app SQLSTATE[HY000] [2002] 连接超时