diff options
author | Gord Thompson <gord@gordthompson.com> | 2020-05-21 16:20:48 -0600 |
---|---|---|
committer | Gord Thompson <gord@gordthompson.com> | 2020-05-23 07:03:41 -0600 |
commit | 9a04c2f65754ac7bf93e0f58f68e59b41e43e67e (patch) | |
tree | 4af9bc7ddcc6d362903d7b8791b76efa7514429e | |
parent | ebceb618efd5a6368c05a78cc3f189f8cab7a42a (diff) | |
download | sqlalchemy-9a04c2f65754ac7bf93e0f58f68e59b41e43e67e.tar.gz |
Stop converting mssql datetime.time parameters to datetime.datetime
Fixes: #5339
Change-Id: Ida75422d8c3fdfc7adae68e547d88df49368a693
-rw-r--r-- | doc/build/changelog/unreleased_13/5339.rst | 7 | ||||
-rw-r--r-- | lib/sqlalchemy/dialects/mssql/base.py | 6 | ||||
-rw-r--r-- | test/dialect/mssql/test_types.py | 46 |
3 files changed, 58 insertions, 1 deletions
diff --git a/doc/build/changelog/unreleased_13/5339.rst b/doc/build/changelog/unreleased_13/5339.rst new file mode 100644 index 000000000..efff6b205 --- /dev/null +++ b/doc/build/changelog/unreleased_13/5339.rst @@ -0,0 +1,7 @@ +.. change:: + :tags: bug, mssql + :tickets: 5339 + + Fixed issue where ``datetime.time`` parameters were being converted to + ``datetime.datetime``, making them incompatible with comparisons like + ``>=`` against an actual :class:`_mssql.TIME` column. diff --git a/lib/sqlalchemy/dialects/mssql/base.py b/lib/sqlalchemy/dialects/mssql/base.py index 228baa84f..f8ed7697a 100644 --- a/lib/sqlalchemy/dialects/mssql/base.py +++ b/lib/sqlalchemy/dialects/mssql/base.py @@ -990,7 +990,11 @@ class TIME(sqltypes.TIME): self.__zero_date, value.time() ) elif isinstance(value, datetime.time): - value = datetime.datetime.combine(self.__zero_date, value) + """ issue #5339 + per: https://github.com/mkleehammer/pyodbc/wiki/Tips-and-Tricks-by-Database-Platform#time-columns + pass TIME value as string + """ # noqa + value = str(value) return value return process diff --git a/test/dialect/mssql/test_types.py b/test/dialect/mssql/test_types.py index 58faab910..f0ddc4564 100644 --- a/test/dialect/mssql/test_types.py +++ b/test/dialect/mssql/test_types.py @@ -56,6 +56,52 @@ from sqlalchemy.testing import pickleable from sqlalchemy.util import b +class TimeParameterTest(fixtures.TablesTest): + __only_on__ = "mssql" + __backend__ = True + + @classmethod + def define_tables(cls, metadata): + Table( + "time_t", + metadata, + Column("id", Integer, primary_key=True, autoincrement=False), + Column("time_col", Time), + ) + + @classmethod + def insert_data(cls, connection): + time_t = cls.tables.time_t + connection.execute( + time_t.insert(), + [ + {"id": 1, "time_col": datetime.time(1, 23, 45, 67)}, + {"id": 2, "time_col": datetime.time(12, 0, 0)}, + {"id": 3, "time_col": datetime.time(16, 19, 59, 999999)}, + {"id": 4, "time_col": None}, + ], + ) + + @testing.combinations( + ("not_null", datetime.time(1, 23, 45, 68), 2), + ("null", None, 1), + id_="iaa", + argnames="time_value, expected_row_count", + ) + def test_time_as_parameter_to_where( + self, time_value, expected_row_count, connection + ): + # issue #5339 + t = self.tables.time_t + + if time_value is None: + qry = t.select().where(t.c.time_col.is_(time_value)) + else: + qry = t.select().where(t.c.time_col >= time_value) + result = connection.execute(qry).fetchall() + eq_(len(result), expected_row_count) + + class TimeTypeTest(fixtures.TestBase): def test_result_processor_no_microseconds(self): expected = datetime.time(12, 34, 56) |