feat: create postgres/jiff-sqlx example

This commit is contained in:
Austin Bonander 2025-04-11 16:17:06 -07:00
parent db6d28bfb1
commit febc62aaab
6 changed files with 296 additions and 44 deletions

233
Cargo.lock generated
View File

@ -115,9 +115,9 @@ dependencies = [
[[package]]
name = "anyhow"
version = "1.0.95"
version = "1.0.97"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04"
checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f"
[[package]]
name = "argon2"
@ -325,7 +325,7 @@ checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -497,7 +497,7 @@ checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -579,7 +579,7 @@ dependencies = [
"regex",
"rustc-hash",
"shlex",
"syn 2.0.96",
"syn 2.0.100",
"which",
]
@ -667,7 +667,7 @@ dependencies = [
"proc-macro-crate",
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -903,7 +903,7 @@ dependencies = [
"heck 0.5.0",
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -1179,7 +1179,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -1190,7 +1190,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
dependencies = [
"darling_core",
"quote",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -1251,7 +1251,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -1586,7 +1586,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -2036,7 +2036,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -2194,6 +2194,58 @@ version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
[[package]]
name = "jiff"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f33145a5cbea837164362c7bd596106eb7c5198f97d1ba6f6ebb3223952e488"
dependencies = [
"jiff-static",
"jiff-tzdb-platform",
"log",
"portable-atomic",
"portable-atomic-util",
"serde",
"windows-sys 0.59.0",
]
[[package]]
name = "jiff-sqlx"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cad0aaf716e798876e02217ae420bd730370a175ffd59870018c4aa4daa1513e"
dependencies = [
"jiff",
"sqlx-core 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)",
"sqlx-postgres 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "jiff-static"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43ce13c40ec6956157a3635d97a1ee2df323b263f09ea14165131289cb0f5c19"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.100",
]
[[package]]
name = "jiff-tzdb"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1283705eb0a21404d2bfd6eef2a7593d240bc42a0bdb39db0ad6fa2ec026524"
[[package]]
name = "jiff-tzdb-platform"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8"
dependencies = [
"jiff-tzdb",
]
[[package]]
name = "jobserver"
version = "0.1.32"
@ -2609,7 +2661,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -2741,7 +2793,7 @@ checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -2853,6 +2905,21 @@ dependencies = [
"windows-sys 0.59.0",
]
[[package]]
name = "portable-atomic"
version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e"
[[package]]
name = "portable-atomic-util"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507"
dependencies = [
"portable-atomic",
]
[[package]]
name = "powerfmt"
version = "0.2.0"
@ -2916,7 +2983,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "483f8c21f64f3ea09fe0f30f5d48c3e8eefe5dac9129f0075f76593b4c1da705"
dependencies = [
"proc-macro2",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -3391,7 +3458,7 @@ checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -3471,7 +3538,7 @@ dependencies = [
"darling",
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -3637,10 +3704,10 @@ dependencies = [
"rand_xoshiro",
"serde",
"serde_json",
"sqlx-core",
"sqlx-core 0.8.3",
"sqlx-macros",
"sqlx-mysql",
"sqlx-postgres",
"sqlx-postgres 0.8.3",
"sqlx-sqlite",
"sqlx-test",
"tempfile",
@ -3725,6 +3792,35 @@ dependencies = [
"webpki-roots",
]
[[package]]
name = "sqlx-core"
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0"
dependencies = [
"bytes",
"crossbeam-queue",
"either",
"event-listener 5.4.0",
"futures-core",
"futures-intrusive",
"futures-io",
"futures-util",
"hashbrown 0.15.2",
"hashlink",
"indexmap 2.7.0",
"log",
"memchr",
"once_cell",
"percent-encoding",
"serde",
"serde_json",
"smallvec",
"thiserror 2.0.11",
"tracing",
"url",
]
[[package]]
name = "sqlx-example-mysql-todos"
version = "0.1.0"
@ -3782,6 +3878,18 @@ dependencies = [
"tokio",
]
[[package]]
name = "sqlx-example-postgres-jiff-sqlx"
version = "0.8.3"
dependencies = [
"anyhow",
"dotenvy",
"jiff",
"jiff-sqlx",
"sqlx",
"tokio",
]
[[package]]
name = "sqlx-example-postgres-json"
version = "0.1.0"
@ -3941,9 +4049,9 @@ version = "0.8.3"
dependencies = [
"proc-macro2",
"quote",
"sqlx-core",
"sqlx-core 0.8.3",
"sqlx-macros-core",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -3961,11 +4069,11 @@ dependencies = [
"serde",
"serde_json",
"sha2",
"sqlx-core",
"sqlx-core 0.8.3",
"sqlx-mysql",
"sqlx-postgres",
"sqlx-postgres 0.8.3",
"sqlx-sqlite",
"syn 2.0.96",
"syn 2.0.100",
"tempfile",
"tokio",
"url",
@ -4008,7 +4116,7 @@ dependencies = [
"sha2",
"smallvec",
"sqlx",
"sqlx-core",
"sqlx-core 0.8.3",
"stringprep",
"thiserror 2.0.11",
"time",
@ -4054,7 +4162,7 @@ dependencies = [
"sha2",
"smallvec",
"sqlx",
"sqlx-core",
"sqlx-core 0.8.3",
"stringprep",
"thiserror 2.0.11",
"time",
@ -4063,6 +4171,43 @@ dependencies = [
"whoami",
]
[[package]]
name = "sqlx-postgres"
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613"
dependencies = [
"atoi",
"base64 0.22.1",
"bitflags 2.7.0",
"byteorder",
"crc",
"dotenvy",
"etcetera",
"futures-channel",
"futures-core",
"futures-util",
"hex",
"hkdf",
"hmac",
"home",
"itoa",
"log",
"md-5",
"memchr",
"once_cell",
"rand",
"serde",
"serde_json",
"sha2",
"smallvec",
"sqlx-core 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)",
"stringprep",
"thiserror 2.0.11",
"tracing",
"whoami",
]
[[package]]
name = "sqlx-sqlite"
version = "0.8.3"
@ -4082,7 +4227,7 @@ dependencies = [
"serde",
"serde_urlencoded",
"sqlx",
"sqlx-core",
"sqlx-core 0.8.3",
"thiserror 2.0.11",
"time",
"tracing",
@ -4107,7 +4252,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac"
dependencies = [
"quote",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -4158,7 +4303,7 @@ dependencies = [
"proc-macro2",
"quote",
"rustversion",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -4258,9 +4403,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.96"
version = "2.0.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80"
checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0"
dependencies = [
"proc-macro2",
"quote",
@ -4287,7 +4432,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -4357,7 +4502,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -4368,7 +4513,7 @@ checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -4449,9 +4594,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
version = "1.43.0"
version = "1.44.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e"
checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48"
dependencies = [
"backtrace",
"bytes",
@ -4473,7 +4618,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -4604,7 +4749,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -4948,7 +5093,7 @@ dependencies = [
"log",
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
"wasm-bindgen-shared",
]
@ -4983,7 +5128,7 @@ checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@ -5273,7 +5418,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
"synstructure",
]
@ -5295,7 +5440,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
]
[[package]]
@ -5315,7 +5460,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
"synstructure",
]
@ -5344,5 +5489,5 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
"syn 2.0.100",
]

View File

@ -14,6 +14,7 @@ members = [
"examples/postgres/axum-social-with-tests",
"examples/postgres/chat",
"examples/postgres/files",
"examples/postgres/jiff-sqlx",
"examples/postgres/json",
"examples/postgres/listen",
"examples/postgres/mockable-todos",

View File

@ -0,0 +1,30 @@
[package]
name = "sqlx-example-postgres-jiff-sqlx"
version.workspace = true
license.workspace = true
edition.workspace = true
repository.workspace = true
keywords.workspace = true
categories.workspace = true
authors.workspace = true
[dependencies]
jiff = "0.2.6"
jiff-sqlx = { version = "0.1.1", features = ["postgres"] }
anyhow = "1.0.97"
dotenvy = "0.15.7"
[dependencies.sqlx]
version = "0.8.3"
# For testing within the SQLx project only.
# Omit this key if copying from this example.
path = "../../.."
features = ["postgres", "runtime-tokio"]
[dependencies.tokio]
version = "1.44.2"
features = ["rt", "net", "time", "macros"]
[lints]
workspace = true

View File

@ -0,0 +1,12 @@
create table date_time_types (
-- `jiff::civil::Date`
date_column date not null,
-- `jiff::civil::Time`
time_column time not null,
-- `jiff::civil::DateTime`
datetime_column timestamp not null,
-- `jiff::Timestamp`
timestamp_column timestamptz not null,
-- `jiff::Span`; note: only decode supported
span_column interval not null
);

View File

@ -0,0 +1,7 @@
[macros.type-overrides]
'DATE' = 'jiff_sqlx::Date'
'TIME' = 'jiff_sqlx::Time'
'TIMESTAMP' = 'jiff_sqlx::DateTime'
'TIMESTAMPTZ' = 'jiff_sqlx::Timestamp'
# Note: only decoding is supported.
'INTERVAL' = 'jiff_sqlx::Span'

View File

@ -0,0 +1,57 @@
use anyhow::Context;
use jiff_sqlx::ToSqlx;
use sqlx::{Connection, PgConnection};
#[derive(Debug)]
struct DateTimeTypes {
date_column: jiff::civil::Date,
time_column: jiff::civil::Time,
datetime_column: jiff::civil::DateTime,
timestamp_column: jiff::Timestamp,
span_column: jiff::Span,
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let mut conn = PgConnection::connect(
&dotenvy::var("DATABASE_URL").context("DATABASE_URL must be set")?
).await
.context("error connecting to DATABASE_URL")?;
sqlx::migrate!().run(&mut conn).await?;
// No overrides necessary, despite `jiff` not being directly integrated with SQLx.
//
// NOTE: `jiff_sqlx::Span` does not implement `Encode`:
// https://docs.rs/jiff-sqlx/latest/jiff_sqlx/struct.Span.html#postgresql-limited-support
//
// Intervals in Postgres have slightly different semantics than `jiff::Span` and so are not
// directly interchangeable. For demonstration purposes, we'll just insert a constant string.
sqlx::query!(
"INSERT INTO date_time_types ( \
date_column, time_column, datetime_column, timestamp_column, span_column \
) VALUES ($1, $2, $3, $4, $5::text::interval)",
jiff::civil::date(2025, 04, 11).to_sqlx(),
jiff::civil::time(15, 39, 54, 0).to_sqlx(),
jiff::civil::datetime(2025, 04, 11, 15, 40, 22, 0).to_sqlx(),
jiff::Timestamp::now().to_sqlx(),
"1 hour"
)
.execute(&mut conn)
.await?;
let row = sqlx::query_as!(
DateTimeTypes,
// `SELECT *` may be applicable here, but is not recommended because the order of columns
// could change from compile time to runtime and cause errors.
"SELECT date_column, time_column, datetime_column, timestamp_column, span_column FROM date_time_types"
)
.fetch_one(&mut conn)
.await?;
println!("Row from database: {row:#?}");
conn.close().await?;
Ok(())
}