#postgresql #sql #async #proc-macro #column-name

tokio-postgres-extractor

tokio_postgres的高性能提取器

1 个不稳定版本

0.7.0 2023年4月29日

#2025数据库接口

Download history 97/week @ 2024-04-08 160/week @ 2024-04-15 305/week @ 2024-04-22 82/week @ 2024-04-29 46/week @ 2024-05-06 195/week @ 2024-05-13 79/week @ 2024-05-20 130/week @ 2024-05-27 39/week @ 2024-06-03 67/week @ 2024-06-10 133/week @ 2024-06-17 42/week @ 2024-06-24 26/week @ 2024-07-01 4/week @ 2024-07-08 6/week @ 2024-07-15 16/week @ 2024-07-22

每月52次 下载

MIT/Apache

35KB
506

tokio-postgres-extractor

crates.io docs.rs

此crate包含用于从tokio-postgres Rows创建高性能提取器的特性和proc宏。

许可证

本项目受以下任一许可证的许可:

  • Apache许可证,版本2.0
  • MIT许可证

任选其一。


lib.rs:

为[tokio_postgres]提供高性能提取器。

此crate包含用于从[Row]创建高性能提取器的特性和proc宏。

示例

提取单行

#[derive(Columns, Extract)]
struct User {
    id: i32,
    name: String,
}

async fn get_user(client: &Client, id: i32) -> Result<User, Error> {
    client
        .query_one("select * from user where id = $1", &[&id])
        .await
        .map(|r| r.extract_once())
}

提取行流

#[derive(Columns, Extract)]
struct User {
    id: i32,
    name: String,
}

async fn get_users(client: &Client) -> Result<Vec<User>, Error> {
    client
        .query_raw("select * from user", None::<i32>)
        .await?
        .extract()
        .try_collect()
        .await
}

泛型类型

泛型类型完全受支持。

#[derive(Columns, Extract)]
struct User<'a, T: ?Sized> {
    id: i32,
    name: &'a T,
}

fn assert_is_extract<'a, T: Extract<'a>>() { }

assert_is_extract::<User<str>>();

自定义列名

您可以指定与字段名不同的列名。请参阅[Columns][macro@Columns] proc宏的文档。

设计

例如,一个简单的映射函数

User {
    id: row.get("id"),
    name: row.get("name"),
}

O(N^2)运行时间,其中N是列数。每次调用row.get都必须遍历所有列并比较其名称与请求列的名称。此crate通过以下方式解决这个问题:

  1. 在编译时构建一个高效的数据结构,将查找时间减少到O(N)

    此数据结构与完美哈希函数类似,但更高效。

  2. 尽可能记住字段到列的映射。

依赖关系

~7–16MB
~230K SLoC