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
1,376 每月下载量
在 3 个 crate 中使用 (通过 postgres-from-row)
11KB
176 行
postgres-from-row
通过 derive FromRow
在结构体和 postgres 行之间生成映射。
该库与 postgres 和 tokio-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
,且该类型没有实现 FromSql
或 FromRow
,但实现了 T: From<C>
或 T: TryFrom<c>
,并且 C
实现了 FromSql
或 FromRow
时,你可以使用 #[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