2 个版本
使用旧的 Rust 2015
0.1.1 | 2019年6月27日 |
---|---|
0.1.0 | 2018年10月15日 |
在 数据库接口 中排名第 1802
17KB
61 行
postgres-mapper
postgres-mapper
是一个 proc-macro,旨在使从 postgresql 表到结构体的映射变得简单。
为什么?
编写大量样板代码,最终在将 postgres Rows 映射到结构体时重复代码可能会很令人沮丧。
例如,某人可能会这样写:
extern crate postgres;
use postgres::rows::Row;
pub struct User {
pub id: i64,
pub name: String,
pub email: Option<String>,
}
impl From<Row> for User {
fn from(row: Row) -> Self {
Self {
id: row.get("id"),
name: row.get("name"),
email: row.get("email"),
}
}
}
// code to execute a query here and get back a row
let user = User::from(row); // this can panic
当手动使用非 panic 的 get_opt
方法变体实现时,这会更糟。
使用此 crate,可以删除样板代码,并派生 panic 和非 panic 实现
#[macro_use] extern crate postgres_mapper_derive;
extern crate postgres_mapper;
use postgres_mapper::FromPostgresRow;
#[derive(PostgresMapper)]
#[pg_mapper(table = "user")]
pub struct User {
pub id: i64,
pub name: String,
pub email: Option<String>,
}
// Code to execute a query here and get back a row might now look like:
let stmt = "SELECT {$1} FROM {$2}
WHERE username = {$3} AND password = {$4}";
let rows = &self
.conn
.query(
stmt,
&[&User::sql_fields(), &User::sql_table(), username, pass],
).unwrap();
let user = rows
.iter()
.next()
.map(|row|
// `postgres_mapper::FromPostgresRow`'s methods do not panic and return a Result
User::from_postgres_row(row)?
);
两个 crate
此存储库包含两个 crate:postgres-mapper
,其中包含一个 Error
枚举和用于从 postgres
或 tokio-postgres
Row
转换而无需 panic 的 trait,以及 postgres-mapper-derive
,其中包含 proc-macro。
postgres-mapper-derive
有 3 个可启用功能(其中 T 是使用提供的 PostgresMapper
proc-macro 生成的结构体)
postgres-support
,它派生impl<'a> From<::postgres::rows::Row<'a>> for T
和impl<'a> From<&'a ::postgres::Row<'a>> for T
实现tokio-postgres-support
,它实现了从impl From<::tokio_postgres::rows::Row> for T
和impl From<&::tokio_postgres::rows::Row> for T
的功能postgres-mapper
为上述每个功能实现postgres-mapper
的FromPostgresRow
和/或FromTokioPostgresRow
特质
postgres-mapper
有两个功能,分别是postgres-support
和tokio-postgres-support
。在postgres-mapper-derive
中启用其中一个时,也必须在postgres-mapper
中启用它。
安装
上述内容可能有些令人困惑,以下是一个示例,其中在两个crate中启用了tokio-postgres
将以下内容添加到您的Cargo.toml
[dependencies.postgres-mapper]
features = ["tokio-postgres-support"]
version = "0.1"
[dependencies.postgres-mapper-derive]
features = ["postgres-mapper", "tokio-postgres-support"]
version = "0.1"
这将派生实现,用于从所有权的和引用的tokio-postgres::rows::Row
进行转换,并实现postgres-mapper
的FromTokioPostgresRow
特质,以进行非恐慌转换。
许可证
ISC。
依赖项
~0–1.8MB
~33K SLoC