Rust and Postgres

From bibbleWiki
Jump to navigation Jump to search

Introductin

Quick into to Rust and Postgres

Rust and Postgres Types

PostgreSQL Type Description Rust Type Notes
smallint, int2 2-byte signed integer i16
integer, int4 4-byte signed integer i32 Most common integer type
bigint, int8 8-byte signed integer i64
serial, serial4 Auto-incrementing int4 i32 Often used for primary keys
bigserial, serial8 Auto-incrementing int8 i64
real, float4 4-byte float f32
double precision, float8 8-byte float f64
numeric, decimal Arbitrary precision rust_decimal::Decimal Requires `postgres-decimal` crate
money Currency amount i64 or custom type Often wrapped for precision
boolean True/false bool
character varying(n), varchar(n) Variable-length string String
character(n), char(n) Fixed-length string String
text Unbounded string String
bytea Binary data Vec<u8>
date Calendar date chrono::NaiveDate
timestamp Date and time (no timezone) chrono::NaiveDateTime
timestamptz Date and time with timezone chrono::DateTime<Utc> or <FixedOffset>
time Time of day chrono::NaiveTime
timetz Time with timezone chrono::DateTime<FixedOffset>
interval Time span postgres_types::Interval or custom
uuid Universally unique ID uuid::Uuid
json, jsonb JSON data serde_json::Value
enum Custom enum Rust enum with #[derive(ToSql, FromSql)]
composite Structured type Rust struct with #[derive(ToSql, FromSql)]

Macro to Do the Mapping

Here is a macro to enable getting of Postgres type to Rust type

#[macro_export]
macro_rules! get_field {
    ($row:expr, $col:expr, $type:ty) => {{
        $row.try_get::<_, $type>($col).map_err(|e| {
            crate::types::DatabaseError::Deserialization {
                column: $col.to_string(),
                source: e,
            }
        })?
    }};
}