#postgresql #row #consume #structs #consuming #macro #derive

pgde

用于将 PostgreSQL 行数据消费到结构体的宏库

12 个版本 (5 个重大更改)

0.6.0 2024年7月28日
0.5.2 2024年7月18日
0.4.1 2024年6月11日
0.3.1 2024年6月9日
0.1.1 2024年6月5日

#290 in FFI

Download history 685/week @ 2024-06-05 126/week @ 2024-06-12 28/week @ 2024-06-19 1/week @ 2024-06-26 64/week @ 2024-07-03 191/week @ 2024-07-10 127/week @ 2024-07-17 190/week @ 2024-07-24 22/week @ 2024-07-31

每月557次下载

MIT 许可证

30KB
283

一个简单的库,可以将 tokio_postgres::row::Row 数据消费到实现了 RowConsumer 特性的结构体。

该包提供了一系列可衍生的实现,可以用来根据偏好消费 PostgreSQL 数据。

  • from_row
  • from_rows
  • consume
  • consume_json 如果启用了 consume_json 功能

后者的实现是从 from_row 构建的。

功能

各种功能提供对附加实现和类型的支持。

功能 描述 额外依赖 默认
bit bit_vec::BitVec 上实现包 bit-vec
chrono 在 chrono 提供的类型上实现包 chrono
consume_json 在实现了 RowConsumer 特性的类上实现 consume_json serde, serde_json
geo geo_types::Point<f64>geo_types::Rect<f64>geo_types::LineString<f64> 上实现 crate geo-types
mac eui48::MacAddress 上实现 crate eui48
json serde_json::Value 上实现 crate serde_json
time 在 time 提供的类型上实现 crate time
uuid uuid::Uuid 上实现 crate uuid

示例

您可以使用 consume 来将 PostgreSQL 行数据消费到一个结构体中,如下所示。

# tokio_test::block_on(async {
use pgde::ConsumeError;
use pgde::RowConsumer;
use pgde_derive::RowConsumer;
use tokio_postgres::{NoTls, Row};

#[derive(RowConsumer)]
struct Foo {
    Id: i32,
    Data: String,
}

match tokio_postgres::connect("host=localhost user=postgres password=password dbname=postgres", NoTls).await {
    Ok(v) => {
        let client = v.0;
        let conn = v.1;

        tokio::spawn(async move {
            if let Err(e) = conn.await {
                eprintln!("connection error: {}", e);
            }
        });

        let query = "select * from public.\"Foo\";";

        match Foo::consume(&client, query, &[]).await {
            Ok(v) => { // v is of type Vec<Foo>
                match v.first() {
                    Some(v) => println!("Id {} has Data {}", v.Id, v.Data),
                    None => eprintln!("No data in table"),
                }
            },
            Err(v) => match v {
                ConsumeError::ConversionError => eprintln!("Could not convert data"),
                ConsumeError::DatabaseConnectionError => eprintln!("Database errored on processing the query"),
            },
        };
    },
    Err(_) => eprintln!("Could not connect to database"),
};
# })

支持 Vec<T>Option<T> 类型的类型,其中 T 实现 FromSql,可以在结构体中使用,也可以作为独立的消费类型,继承 RowConsumer。查询可空字段时,最好将字段类型包裹在 Option<> 中。请参阅 RowConsumer trait 以了解 from_rowfrom_rows 的使用示例。

此 crate 还提供对各种数据类型的实现,其中一些通过启用功能提供。

类型 功能
bool default
i8 default
i16 default
i32 default
u32 default
i64 default
f32 default
f64 default
Vec<u8> default
String default
SystemTime default
IpAddr default
bit_vec::BitVec bit
chrono::NaiveDateTime chrono
chrono::DateTime<Utc> chrono
chrono::DateTime<Local> chrono
chrono::DateTime<FixedOffset> chrono
chrono::NaiveDate chrono
chrono::NaiveTime chrono
geo_types::Point<f64> geo
geo_types::Rect<f64> geo
geo_types::LineString<f64> geo
eui48::MacAddress mac
serde_json::Value json
time::PrimitiveDateTime time
time::OffsetDateTime time
time::Date time
time::Time time
uuid::Uuid uuid

测试

测试需要访问没有表的 PostgreSQL 数据库。设置以下环境变量将允许您进行测试。

环境变量 描述
PGDE_DB_HOST 数据库可访问的主机。
POSTGRES_USER 要提供的用户凭据。
POSTGRES_PASSWORD 要提供的密码。
POSTGRES_DB 用于测试的数据库名称。

依赖项

~7–18MB
~254K SLoC