@@ -105,6 +105,7 @@ class FooBar(Base):
105105 date = sa .Column (sa .Date )
106106 datetime_notz = sa .Column (DateTime (timezone = False ))
107107 datetime_tz = sa .Column (DateTime (timezone = True ))
108+ time = sa .Column (sa .Time )
108109
109110
110111@pytest .fixture
@@ -228,3 +229,33 @@ def test_datetime_date(session):
228229 # Compare outcome.
229230 assert result ["datetime_notz" ] == dt .datetime (2009 , 5 , 13 , 0 , 0 , 0 )
230231 assert result ["datetime_tz" ] == dt .datetime (2009 , 5 , 13 , 0 , 0 , 0 )
232+
233+
234+ @pytest .mark .skipif (SA_VERSION < SA_1_4 , reason = "Test case not supported on SQLAlchemy 1.3" )
235+ def test_time (session ):
236+ """
237+ An integration test for `sa.Time`.
238+
239+ CrateDB has no native `TIME` type, so the dialect stores it as a `STRING`
240+ in ISO 8601 format and parses it back into a `dt.time` object on read.
241+
242+ Validates the fix for https://github.com/crate/sqlalchemy-cratedb/issues/206.
243+ """
244+
245+ # insert
246+ foo_item = FooBar (
247+ name = "foo" ,
248+ time = dt .time (19 , 0 , 30 , 123456 ),
249+ )
250+ session .add (foo_item )
251+ session .commit ()
252+ session .execute (sa .text ("REFRESH TABLE foobar" ))
253+
254+ # query
255+ result = (
256+ session .execute (sa .select (FooBar .name , FooBar .time )).mappings ().first ()
257+ )
258+
259+ # compare
260+ assert result ["time" ] == dt .time (19 , 0 , 30 , 123456 )
261+ assert isinstance (result ["time" ], dt .time )
0 commit comments