# sqlx-pg-uint
`SQLx` extension to support working with Rust unsigned integers in PostgreSQL.
---
This crate provides types with `sqlx::{Encode, Decode, Type}` implemented for them, which allow you
to work with fixed-size unsigned integers in PostgreSQL.
```rs
use sqlx_pg_uint::PgU64;
fn main() {
let a_u64_number = 2937854645u64;
let pg_u_64 = PgU64::from(a_u64_number);
println!("PgU64: {}", pg_u_64);
let back_to_u64: u64 = pg_u_64.to_uint();
println!("Back to u64: {}", back_to_u64);
println!(
"Maths work the same way as you'd expect: {}",
PgU64::from(67) + PgU64::from(2) * PgU64::from(3) / PgU64::from(3)
);
println!(
"Interact with the underlying BigDecimal type directly: {}",
pg_u_64.as_big_decimal()
);
println!("PgUint types can be converted to and from BigDecimals, and are storable in an sqlx::Postgres database.");
println!("If you load a PgUint from a database successfully, you can be sure that it's a valid fixed-size unsigned integer.");
}
```
When defining a column for a PostgreSQL table, which should store a fixed-size unsigned integer,
you should use the `NUMERIC` type.
| `PgU8` | `NUMERIC(3, 0)` |
| `PgU16` | `NUMERIC(5, 0)` |
| `PgU32` | `NUMERIC(10, 0)` |
| `PgU64` | `NUMERIC(20, 0)` |
| `PgU128` | `NUMERIC(39, 0)` |
Additionally, you are advised to use `constraints` to ensure that the value stored in the column is
a valid fixed-size unsigned integer, guaranteed to be in range for the type.
```sql
CREATE TABLE my_table (
-- `id` is an unsigned 64-bit integer in the corresponding Rust struct
id numeric(20, 0) not null constraint chk_id_range check (id >= 0 AND id <= 18446744073709551615),
);
```
> Constraining columns (or Rust types) to only store valid values is not a recommendation specific to
> this crate, but a general best practice to avoid faulty states in your application.
## serde
This crate also provides serde de-/serialization, if the `serde` feature is enabled.
With the `serde` feature enabled, you can use the `PgUint` types in structs that you want to serialize and deserialize.
Types are serialized as their respective unsigned integer values, and deserialized using the underlying `Deserialize` trait implemented for `BigDecimal`.
## MSRV
1.74.1