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

postgres-from-row-derive

postgres-from-row 内部 proc-macro 库

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日

#7#from-row

Download history 179/week @ 2024-03-13 141/week @ 2024-03-20 97/week @ 2024-03-27 104/week @ 2024-04-03 114/week @ 2024-04-10 205/week @ 2024-04-17 269/week @ 2024-04-24 155/week @ 2024-05-01 312/week @ 2024-05-08 254/week @ 2024-05-15 309/week @ 2024-05-22 332/week @ 2024-05-29 357/week @ 2024-06-05 482/week @ 2024-06-12 277/week @ 2024-06-19 227/week @ 2024-06-26

1,376 每月下载量
3 个 crate 中使用 (通过 postgres-from-row)

自定义许可证

11KB
176

postgres-from-row

通过 derive FromRow 在结构体和 postgres 行之间生成映射。

该库与 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>
}

依赖关系

~0.6–1MB
~24K SLoC