Skip to content

Commit fb4c7be

Browse files
committed
DateTime and more: Serialize CrateDB's DateTime types using zone info
Effectively, just add `%z` to the format string passed to `strftime`. -- https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes
1 parent 34e47ad commit fb4c7be

File tree

3 files changed

+15
-13
lines changed

3 files changed

+15
-13
lines changed

src/sqlalchemy_cratedb/dialect.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def bind_processor(self, dialect):
117117
def process(value):
118118
if value is not None:
119119
assert isinstance(value, datetime)
120-
return value.strftime('%Y-%m-%dT%H:%M:%S.%fZ')
120+
return value.strftime('%Y-%m-%dT%H:%M:%S.%f%z')
121121
return value
122122
return process
123123

tests/datetime_test.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,13 @@
5151

5252

5353
INPUT_DATE = dt.date(2009, 5, 13)
54-
INPUT_DATETIME_NOTZ = dt.datetime(2009, 5, 13, 19, 19, 30, 123456)
55-
INPUT_DATETIME_TZ = dt.datetime(2009, 5, 13, 19, 19, 30, 123456, tzinfo=zoneinfo.ZoneInfo("Europe/Kyiv"))
54+
INPUT_DATETIME_NOTZ = dt.datetime(2009, 5, 13, 19, 00, 30, 123456)
55+
INPUT_DATETIME_TZ = dt.datetime(2009, 5, 13, 19, 00, 30, 123456, tzinfo=zoneinfo.ZoneInfo("Europe/Kyiv"))
5656
OUTPUT_DATE = INPUT_DATE
57-
OUTPUT_TIME = dt.time(19, 19, 30, 123000)
58-
OUTPUT_DATETIME_NOTZ = dt.datetime(2009, 5, 13, 19, 19, 30, 123000)
59-
OUTPUT_DATETIME_TZ = dt.datetime(2009, 5, 13, 19, 19, 30, 123000)
57+
OUTPUT_TIMETZ_NOTZ = dt.time(19, 00, 30, 123000)
58+
OUTPUT_TIMETZ_TZ = dt.time(16, 00, 30, 123000)
59+
OUTPUT_DATETIME_NOTZ = dt.datetime(2009, 5, 13, 19, 00, 30, 123000)
60+
OUTPUT_DATETIME_TZ = dt.datetime(2009, 5, 13, 16, 00, 30, 123000)
6061

6162

6263
@skipIf(SA_VERSION < SA_1_4, "SQLAlchemy 1.3 suddenly has problems with these test cases")
@@ -143,11 +144,11 @@ def test_datetime_notz(session):
143144
assert result["date"] == OUTPUT_DATE
144145
assert result["datetime_notz"] == OUTPUT_DATETIME_NOTZ
145146
assert result["datetime_notz"].tzname() is None
146-
assert result["datetime_notz"].timetz() == OUTPUT_TIME
147+
assert result["datetime_notz"].timetz() == OUTPUT_TIMETZ_NOTZ
147148
assert result["datetime_notz"].tzinfo is None
148149
assert result["datetime_tz"] == OUTPUT_DATETIME_NOTZ
149150
assert result["datetime_tz"].tzname() is None
150-
assert result["datetime_tz"].timetz() == OUTPUT_TIME
151+
assert result["datetime_tz"].timetz() == OUTPUT_TIMETZ_NOTZ
151152
assert result["datetime_tz"].tzinfo is None
152153

153154

@@ -169,16 +170,17 @@ def test_datetime_tz(session):
169170
session.execute(sa.text("REFRESH TABLE foobar"))
170171

171172
# Query record.
173+
session.expunge(foo_item)
172174
result = session.execute(sa.select(
173175
FooBar.name, FooBar.date, FooBar.datetime_notz, FooBar.datetime_tz)).mappings().first()
174176

175177
# Compare outcome.
176178
assert result["date"] == OUTPUT_DATE
177-
assert result["datetime_notz"] == OUTPUT_DATETIME_TZ
179+
assert result["datetime_notz"] == OUTPUT_DATETIME_NOTZ
178180
assert result["datetime_notz"].tzname() is None
179-
assert result["datetime_notz"].timetz() == OUTPUT_TIME
181+
assert result["datetime_notz"].timetz() == OUTPUT_TIMETZ_NOTZ
180182
assert result["datetime_notz"].tzinfo is None
181183
assert result["datetime_tz"] == OUTPUT_DATETIME_TZ
182184
assert result["datetime_tz"].tzname() is None
183-
assert result["datetime_tz"].timetz() == OUTPUT_TIME
185+
assert result["datetime_tz"].timetz() == OUTPUT_TIMETZ_TZ
184186
assert result["datetime_tz"].tzinfo is None

tests/update_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def test_onupdate_is_triggered(self):
8181
args = args[1]
8282
self.assertEqual(expected_stmt, stmt)
8383
self.assertEqual(40, args[0])
84-
dt = datetime.strptime(args[1], '%Y-%m-%dT%H:%M:%S.%fZ')
84+
dt = datetime.strptime(args[1], '%Y-%m-%dT%H:%M:%S.%f')
8585
self.assertIsInstance(dt, datetime)
8686
self.assertGreater(dt, now)
8787
self.assertEqual('Arthur', args[2])
@@ -110,6 +110,6 @@ def test_bulk_update(self):
110110
self.assertEqual(expected_stmt, stmt)
111111
self.assertEqual('Julia', args[0])
112112
self.assertEqual({'favorite_book': 'Romeo & Juliet'}, args[1])
113-
dt = datetime.strptime(args[2], '%Y-%m-%dT%H:%M:%S.%fZ')
113+
dt = datetime.strptime(args[2], '%Y-%m-%dT%H:%M:%S.%f')
114114
self.assertIsInstance(dt, datetime)
115115
self.assertGreater(dt, before_update_time)

0 commit comments

Comments
 (0)