1 个不稳定版本
0.7.0 | 2023年4月29日 |
---|
#2025 在 数据库接口
每月52次 下载
35KB
506 行
tokio-postgres-extractor
此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通过以下方式解决这个问题:
-
在编译时构建一个高效的数据结构,将查找时间减少到
O(N)
。此数据结构与完美哈希函数类似,但更高效。
-
尽可能记住字段到列的映射。
依赖关系
~7–16MB
~230K SLoC