#postgresql #tokio #tokio-postgresql #mapper #struct

tokio-pg-mapper

Proc-macro library used to map a tokio-postgres row to a Rust type (struct)

9 releases

0.2.0 Jan 4, 2021
0.1.9 Dec 31, 2020
0.1.8 May 26, 2020
0.1.7 Mar 26, 2020
0.1.4 Jan 11, 2020

#1811 in Database interfaces

Download history 1169/week @ 2024-12-17 527/week @ 2024-12-24 652/week @ 2024-12-31 1037/week @ 2025-01-07 1293/week @ 2025-01-14 1083/week @ 2025-01-21 1104/week @ 2025-01-28 1688/week @ 2025-02-04 1489/week @ 2025-02-11 1176/week @ 2025-02-18 1579/week @ 2025-02-25 1394/week @ 2025-03-04 1591/week @ 2025-03-11 1165/week @ 2025-03-18 1417/week @ 2025-03-25 882/week @ 2025-04-01

5,180 downloads per month
Used in 6 crates (5 directly)

ISC license

11KB
57 lines

tokio-pg-mapper

tokio_postgres-mapper is a proc-macro designed to make mapping from postgresql tables to structs simple.

Why?

It can be frustrating to write a lot of boilerplate and, ultimately, duplicated code for mapping from postgres Rows into structs.

For example, this might be what someone would normally write:

extern crate postgres;

use postgres::rows::Row;

pub struct User {
    pub id: i64,
    pub name: String,
    pub email: Option<String>,
}

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

// code to execute a query here and get back a row
let user = User::from(row); // this can panic

This becomes worse when manually implementating using the non-panicking get_opt method variant.

Using this crate, the boilerplate is removed, and panicking and non-panicking implementations are derived:

extern crate tokio_pg_mapper_derive;
extern crate tokio_pg_mapper;

use tokio_pg_mapper::FromTokioPostgresRow;
use tokio_pg_mapper_derive::PostgresMapper;

#[derive(PostgresMapper)]
pub struct User {
    pub id: i64,
    pub name: String,
    pub email: Option<String>,
}

// Code to execute a query here and get back a row might now look like:
let stmt = "SELECT * FROM user WHERE username = $1 AND password = $2";

let result = client.query_one(stmt, &[&5, "asdf"]).await?;
let user = User::from_row(result).unwrap(); // or from_row_ref(&result)


The two crates

This repository contains two crates: postgres-mapper which contains an Error enum and traits for converting from a tokio-postgres Row without panicking, and postgres-mapper-derive which contains the proc-macro.

Installation

Install tokio-pg-mapper-derive and tokio-pg-mapper from crates.io

License

ISC.

Dependencies

~8–18MB
~242K SLoC