Skip to content

Commit 76a4a33

Browse files
committed
feat!: switch DateTime sqlx type to timestamptz and remove PgHasArrayType traits
1 parent 7a1cbde commit 76a4a33

File tree

5 files changed

+32
-122
lines changed

5 files changed

+32
-122
lines changed

migrations/01_astrolabe_tests.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CREATE TABLE astrolabe_tests (
2-
timestamp TIMESTAMP,
3-
timestamps TIMESTAMP[],
2+
timestamp TIMESTAMPTZ,
3+
timestamps TIMESTAMPTZ[],
44
date DATE,
55
dates DATE[],
66
time TIME,

src/sqlx/postgres/date.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,13 @@ use crate::{util::constants::BUG_MSG, Date, DateUtilities};
44
use sqlx::{
55
encode::IsNull,
66
error::BoxDynError,
7-
postgres::{PgArgumentBuffer, PgHasArrayType, PgTypeInfo, PgValueRef},
7+
postgres::{PgArgumentBuffer, PgTypeInfo, PgValueRef},
88
Decode, Encode, Postgres, Type,
99
};
1010

1111
impl Type<Postgres> for Date {
1212
fn type_info() -> PgTypeInfo {
13-
PgTypeInfo::with_name("date")
14-
}
15-
}
16-
17-
impl PgHasArrayType for Date {
18-
fn array_type_info() -> PgTypeInfo {
19-
PgTypeInfo::with_name("date[]")
13+
PgTypeInfo::with_name("DATE")
2014
}
2115
}
2216

src/sqlx/postgres/datetime.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,13 @@ use crate::{util::constants::BUG_MSG, DateTime, TimeUtilities};
44
use sqlx::{
55
encode::IsNull,
66
error::BoxDynError,
7-
postgres::{PgArgumentBuffer, PgHasArrayType, PgTypeInfo, PgValueRef},
7+
postgres::{PgArgumentBuffer, PgTypeInfo, PgValueRef},
88
Decode, Encode, Postgres, Type,
99
};
1010

1111
impl Type<Postgres> for DateTime {
1212
fn type_info() -> PgTypeInfo {
13-
PgTypeInfo::with_name("timestamp")
14-
}
15-
}
16-
17-
impl PgHasArrayType for DateTime {
18-
fn array_type_info() -> PgTypeInfo {
19-
PgTypeInfo::with_name("timestamp[]")
13+
PgTypeInfo::with_name("TIMESTAMPTZ")
2014
}
2115
}
2216

src/sqlx/postgres/time.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,13 @@ use crate::{util::constants::BUG_MSG, Time};
44
use sqlx::{
55
encode::IsNull,
66
error::BoxDynError,
7-
postgres::{PgArgumentBuffer, PgHasArrayType, PgTypeInfo, PgValueRef},
7+
postgres::{PgArgumentBuffer, PgTypeInfo, PgValueRef},
88
Decode, Encode, Postgres, Type,
99
};
1010

1111
impl Type<Postgres> for Time {
1212
fn type_info() -> PgTypeInfo {
13-
PgTypeInfo::with_name("time")
14-
}
15-
}
16-
17-
impl PgHasArrayType for Time {
18-
fn array_type_info() -> PgTypeInfo {
19-
PgTypeInfo::with_name("time[]")
13+
PgTypeInfo::with_name("TIME")
2014
}
2115
}
2216

tests/sqlx-postgres.rs

Lines changed: 24 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -6,154 +6,82 @@ mod sqlx_postgres_tests {
66

77
#[sqlx::test]
88
async fn datetime(db_pool: PgPool) {
9+
#[derive(sqlx::FromRow)]
10+
struct TimestampRow {
11+
timestamp: DateTime,
12+
}
913
let datetime = DateTime::from_ymdhms(2024, 1, 2, 10, 30, 40)
1014
.unwrap()
1115
.set_nano(123_456_789)
1216
.unwrap();
13-
let insert_result = sqlx::query!(
17+
let insert_result: Result<TimestampRow, sqlx::Error> = sqlx::query_as(
1418
r#"
1519
INSERT INTO astrolabe_tests (timestamp) VALUES ($1)
16-
RETURNING timestamp as "timestamp: DateTime"
20+
RETURNING timestamp
1721
"#,
18-
datetime as DateTime
1922
)
23+
.bind(datetime)
2024
.fetch_one(&db_pool)
2125
.await;
2226

2327
assert!(insert_result.is_ok());
2428

25-
let datetime = insert_result.unwrap().timestamp.unwrap();
29+
let datetime = insert_result.unwrap().timestamp;
2630

2731
assert_eq!(
2832
"2024-01-02T10:30:40.123456000Z",
2933
datetime.format_rfc3339(Precision::Nanos)
3034
);
3135
}
3236

33-
#[sqlx::test]
34-
async fn datetime_array(db_pool: PgPool) {
35-
let datetime_1 = DateTime::from_ymdhms(2024, 1, 2, 10, 30, 40)
36-
.unwrap()
37-
.set_nano(123_456_789)
38-
.unwrap();
39-
let datetime_2 = DateTime::from_ymdhms(1980, 1, 2, 10, 30, 40)
40-
.unwrap()
41-
.set_nano(123_456_789)
42-
.unwrap();
43-
let insert_result = sqlx::query!(
44-
r#"
45-
INSERT INTO astrolabe_tests (timestamps) VALUES ($1)
46-
RETURNING timestamps as "timestamps: Vec<DateTime>"
47-
"#,
48-
vec![datetime_1, datetime_2] as Vec<DateTime>
49-
)
50-
.fetch_one(&db_pool)
51-
.await;
52-
53-
assert!(insert_result.is_ok());
54-
55-
let datetimes = insert_result.unwrap().timestamps.unwrap();
56-
57-
assert_eq!(
58-
"2024-01-02T10:30:40.123456000Z",
59-
datetimes[0].format_rfc3339(Precision::Nanos)
60-
);
61-
assert_eq!(
62-
"1980-01-02T10:30:40.123456000Z",
63-
datetimes[1].format_rfc3339(Precision::Nanos)
64-
);
65-
}
66-
6737
#[sqlx::test]
6838
async fn date(db_pool: PgPool) {
39+
#[derive(sqlx::FromRow)]
40+
struct DateRow {
41+
date: Date,
42+
}
6943
let date = Date::from_ymd(2024, 1, 2).unwrap();
70-
let insert_result = sqlx::query!(
44+
let insert_result: Result<DateRow, sqlx::Error> = sqlx::query_as(
7145
r#"
7246
INSERT INTO astrolabe_tests (date) VALUES ($1)
73-
RETURNING date as "date: Date"
47+
RETURNING date
7448
"#,
75-
date as Date
7649
)
50+
.bind(date)
7751
.fetch_one(&db_pool)
7852
.await;
7953

8054
assert!(insert_result.is_ok());
8155

82-
let date = insert_result.unwrap().date.unwrap();
56+
let date = insert_result.unwrap().date;
8357

8458
assert_eq!("2024/01/02", date.format("yyyy/MM/dd"));
8559
}
8660

87-
#[sqlx::test]
88-
async fn date_array(db_pool: PgPool) {
89-
let date_1 = Date::from_ymd(2024, 1, 2).unwrap();
90-
let date_2 = Date::from_ymd(1980, 1, 2).unwrap();
91-
let insert_result = sqlx::query!(
92-
r#"
93-
INSERT INTO astrolabe_tests (dates) VALUES ($1)
94-
RETURNING dates as "dates: Vec<Date>"
95-
"#,
96-
vec![date_1, date_2] as Vec<Date>
97-
)
98-
.fetch_one(&db_pool)
99-
.await;
100-
101-
assert!(insert_result.is_ok());
102-
103-
let dates = insert_result.unwrap().dates.unwrap();
104-
105-
assert_eq!("2024/01/02", dates[0].format("yyyy/MM/dd"));
106-
assert_eq!("1980/01/02", dates[1].format("yyyy/MM/dd"));
107-
}
108-
10961
#[sqlx::test]
11062
async fn time(db_pool: PgPool) {
63+
#[derive(sqlx::FromRow)]
64+
struct TimeRow {
65+
time: Time,
66+
}
11167
let time = Time::from_hms(10, 30, 40)
11268
.unwrap()
11369
.set_nano(123_456_789)
11470
.unwrap();
115-
let insert_result = sqlx::query!(
71+
let insert_result: Result<TimeRow, sqlx::Error> = sqlx::query_as(
11672
r#"
11773
INSERT INTO astrolabe_tests (time) VALUES ($1)
118-
RETURNING time as "time: Time"
74+
RETURNING time
11975
"#,
120-
time as Time
12176
)
77+
.bind(time)
12278
.fetch_one(&db_pool)
12379
.await;
12480

12581
assert!(insert_result.is_ok());
12682

127-
let time = insert_result.unwrap().time.unwrap();
83+
let time = insert_result.unwrap().time;
12884

12985
assert_eq!("10:30:40:123456000", time.format("HH:mm:ss:nnnnn"));
13086
}
131-
132-
#[sqlx::test]
133-
async fn time_array(db_pool: PgPool) {
134-
let time_1 = Time::from_hms(10, 30, 40)
135-
.unwrap()
136-
.set_nano(123_456_789)
137-
.unwrap();
138-
let time_2 = Time::from_hms(23, 20, 35)
139-
.unwrap()
140-
.set_nano(123_456_789)
141-
.unwrap();
142-
let insert_result = sqlx::query!(
143-
r#"
144-
INSERT INTO astrolabe_tests (times) VALUES ($1)
145-
RETURNING times as "times: Vec<Time>"
146-
"#,
147-
vec![time_1, time_2] as Vec<Time>
148-
)
149-
.fetch_one(&db_pool)
150-
.await;
151-
152-
assert!(insert_result.is_ok());
153-
154-
let times = insert_result.unwrap().times.unwrap();
155-
156-
assert_eq!("10:30:40:123456000", times[0].format("HH:mm:ss:nnnnn"));
157-
assert_eq!("23:20:35:123456000", times[1].format("HH:mm:ss:nnnnn"));
158-
}
15987
}

0 commit comments

Comments
 (0)