#postgresql #sql-database #sql

tokio-postgres-utils

用于与tokio-postgres包协同工作的工具

3个不稳定版本

0.2.0 2024年7月8日
0.1.1 2024年6月24日
0.1.0 2024年6月24日

803数据库接口

每月下载34

MIT 协议

6KB

它提供与tokio-postgres包协同工作的工具,特别是通过使用FromRowTryFromRow派生宏。这些宏简化了将数据库行转换为Rust结构体的过程。

安装

tokio-postgres-utils添加到您的Cargo.toml

[dependencies]
tokio-postgres = "0.7"
tokio-postgres-utils = "0.1"

示例

use tokio_postgres_utils::FromRow;

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

展开为类似

use tokio_postgres::Row;

impl From<&Row> for User {
    fn from(row: &Row) -> Self {
        Self {
            id: row.get("id"),
            name: row.get("name"),
        }
    }
}

字段属性 #[column(..)]

可以指定多个属性来自定义如何读取行中的每个列

重命名

当Rust中字段的名称与其对应的列的名称不匹配时,您可以使用重命名属性来指定该字段在行中的名称。例如

use tokio_postgres_utils::FromRow;

#[derive(FromRow)]
struct User {
    id: i32,
    name: String,
    #[column(rename = "description")]
    about_me: String
}

给定如下查询

SELECT id, name, description FROM users;

将读取列 description 的内容到字段 about_me 中。

扁平化

如果您想处理一个实现了FromRow的字段,您可以使用扁平化属性来指定您希望它使用FromRow进行解析而不是常规方法。例如

use tokio_postgres_utils::FromRow;

#[derive(FromRow)]
struct Address {
    country: String,
    city: String,
    road: String,
}

#[derive(FromRow)]
struct User {
    id: i32,
    name: String,
    #[column(flatten)]
    address: Address,
}

给定如下查询

SELECT id, name, country, city, road FROM users;

跳过

当映射数据库查询结果时,应忽略相应的字段并使用默认值。

这在您的结构体中有字段不在查询结果中或您想排除某些字段被查询填充时特别有用。

use tokio_postgres_utils::FromRow;

#[derive(Default)]
struct Address {
    user_name: String,
    street: String,
    city: String,
}

#[derive(FromRow)]
struct User {
    name: String,
    #[column(skip)]
    addresses: Vec<Address>,
}

给定如下查询

SELECT name FROM users;

依赖关系

~275–730KB
~17K SLoC