#postgresql #from-row #mapper #postgres-tokio

postgres-from-row

可以将PostgreSQL行转换为结构的可派生特质

7个版本 (4个重大更新)

0.5.2 2023年5月26日
0.5.1 2023年1月19日
0.4.0 2023年1月10日
0.3.0 2023年1月10日
0.1.0 2022年10月25日

数据库接口中排名905

Download history 193/week @ 2024-03-14 139/week @ 2024-03-21 88/week @ 2024-03-28 80/week @ 2024-04-04 145/week @ 2024-04-11 193/week @ 2024-04-18 241/week @ 2024-04-25 188/week @ 2024-05-02 302/week @ 2024-05-09 251/week @ 2024-05-16 362/week @ 2024-05-23 325/week @ 2024-05-30 352/week @ 2024-06-06 476/week @ 2024-06-13 274/week @ 2024-06-20 181/week @ 2024-06-27

每月下载量1,338
2 个crate使用

自定义许可

7KB

postgres-from-row

派生FromRow以在结构体和PostgreSQL行之间生成映射。

此crate与postgrestokio-postgres都兼容。

[dependencies]
postgres_from_row = "0.5.2"

示例

use postgres_from_row::FromRow;

#[derive(FromRow)]
struct Todo {
    todo_id: i32,
    text: String
    author_id: i32,
}

let row = client.query_one("SELECT todo_id, text, author_id FROM todos", &[]).unwrap();

// Pass a row with the correct columns.
let todo = Todo::from_row(&row);

let row = client.query_one("SELECT foo FROM bar", &[]).unwrap();

// Use `try_from_row` if the operation could fail.
let todo = Todo::try_from_row(&row);
assert!(todo.is_err());

每个字段都需要实现postgres::types::FromSql,因为这将用于将单个列转换为指定的类型。如果您想覆盖此行为并将其委托给也实现了FromRow的嵌套结构,请使用#[from_row]

use postgres_from_row::FromRow;

#[derive(FromRow)]
struct Todo {
    todo_id: i32,
    text: String,
    #[from_row(flatten)]
    author: User
}

#[derive(FromRow)]
struct User {
    user_id: i32,
    username: String
}

let row = client.query_one("SELECT todo_id, text, user_id, username FROM todos t, users u WHERE t.author_id = u.user_id", &[]).unwrap();
let todo = Todo::from_row(&row);

如果结构体包含一个与SQL列名称不同的字段名称,您可以使用#[from_row]属性。

当你的结构体中的字段类型为 T,且未实现 FromSqlFromRow 接口,但实现了 T: From<C>T: TryFrom<c> 接口时,并且 C 实现了 FromSqlFromRow 接口,你可以使用 #[from_row(from = "C")]#[from_row(try_from = "C")]。这将使用类型 C 从行中提取数据,并将其最终转换为 T 类型。


struct Todo {
    // If the postgres column is named `todo_id`.
    #[from_row(rename = "todo_id")]
    id: i32,
    // If the postgres column is `VARCHAR`, it will be decoded to `String`,
    // using `FromSql` and then converted to `Vec<u8>` using `std::convert::From`.
    #[from_row(from = "String")]
    todo: Vec<u8>
}

依赖项

~7–17MB
~239K SLoC