2 个版本

使用旧的 Rust 2015

0.1.1 2019年6月27日
0.1.0 2018年10月15日

数据库接口 中排名第 1802

ISC 许可证

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 枚举和用于从 postgrestokio-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 Timpl<'a> From<&'a ::postgres::Row<'a>> for T 实现
  • tokio-postgres-support,它实现了从impl From<::tokio_postgres::rows::Row> for Timpl From<&::tokio_postgres::rows::Row> for T的功能
  • postgres-mapper为上述每个功能实现postgres-mapperFromPostgresRow和/或FromTokioPostgresRow特质

postgres-mapper有两个功能,分别是postgres-supporttokio-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-mapperFromTokioPostgresRow特质,以进行非恐慌转换。

许可证

ISC。

依赖项

~0–1.8MB
~33K SLoC