24 个版本
0.11.1 | 2023 年 2 月 14 日 |
---|---|
0.11.0 | 2022 年 7 月 1 日 |
0.10.1 | 2022 年 2 月 22 日 |
0.10.0 | 2021 年 12 月 8 日 |
0.3.1 | 2017 年 11 月 6 日 |
#376 在 编码 中
58 每月下载量
在 3 个 crate 中使用 (通过 hdbconnect_impl)
86KB
2K SLoC
serde_db
支持灵活地将数据库结果集和行反序列化为 Rust 类型,以及将 Rust 类型序列化为数据库参数值。
基于 serde,这个包可以促进应用程序和数据库驱动程序之间的数据交换。它旨在由数据库驱动程序的实现者使用,从而使他们能够提供更舒适的驱动程序 API。
使用方法
将 serde_db
添加到项目 Cargo.toml
中的依赖关系部分,
[dependencies]
serde_db = "0.11"
反序列化示例
以下示例假设 DB 驱动程序在其结果集类型上公开了一个函数
fn try_into<'de, T: serde::Deserialize<'de>>(self) -> Result<T, E>
该函数使用 serde_db
实现。
然后应用程序可以直接将数据库结果分配给适当的 Rust 变量!
将 n×m 的结果集转换为结构体的 Vec
#[macro_use]
extern crate serde_derive;
...
#[derive(Deserialize)]
struct MyStruct {...}
...
let resultset = ...;
let data: Vec<MyStruct> = resultset.try_into()?;
注意,MyStruct
必须实现 serde::Deserialize
。
将 n×1 的结果集分配给字段的 Vec
let vec_s: Vec<String> = resultset.try_into()?;
将 1×1 的结果集分配给单个字段
let s: String = resultset.try_into()?;
将行分配给元组或结构体
为了更好地流式传输大型结果集,您可能希望遍历行,如下所示
for row in resultset {
let t: (String, NaiveDateTime, i32, Option<i32>) = row.try_into()?;
}
或
for row in resultset {
let data: MyStruct = row.try_into()?;
}
序列化示例
serde_db
还在 DB 驱动程序需要将 Rust 值转换为 DB 类型时使用。
例如,预编译语句可能有一个泛型函数
fn add_batch<T>(&mut self, input: &T) -> DbResult<()>
where T: serde::Serialize
如果它使用 serde_db
实现,那么应用程序可以将对应于预编译语句参数的 Rust 值的 元组 传递给应用程序,或者它们可以传递一个适当的实现 serde::Serialize
的 结构体。
在这两种情况下,它们不需要区分可空和不可空的数据库值(除了它们不能将 Option::None
转换为不可空的数据库值之外)。
在其对DbvFactory
的实现中,数据库驱动程序可以通过灵活地在不同的数字类型之间转换,使自己的生活更加简单(示例可在此软件包的测试中找到)。
add_batch()
的实现将input
转换为驱动程序数据库值的Vec,随后可以发送到数据库服务器
let db_values: Vec<DBValue> = serde_db::ser::to_params(&input, input_metadata)?;
需要准备语句包含所需输入参数的元数据,这些参数实现了DbvFactory
。
Cargo功能
trace
(无默认值)
添加跟踪输出(使用log
宏)。
依赖项
~0.4–1MB
~23K SLoC