#database-driver #serde #driver #database #relational

serde_db

数据库结果集的反序列化和数据库参数的序列化

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编码

Download history 29/week @ 2024-03-14 45/week @ 2024-03-21 30/week @ 2024-03-28 15/week @ 2024-04-04 10/week @ 2024-04-11 14/week @ 2024-04-18 15/week @ 2024-04-25 8/week @ 2024-05-02 5/week @ 2024-05-09 10/week @ 2024-05-16 11/week @ 2024-05-23 31/week @ 2024-05-30 21/week @ 2024-06-06 19/week @ 2024-06-13 10/week @ 2024-06-20 3/week @ 2024-06-27

58 每月下载量
3 个 crate 中使用 (通过 hdbconnect_impl)

MIT/Apache

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