From f7e818cda13827df4915c0a196935ccca46d8846 Mon Sep 17 00:00:00 2001 From: Valeriya Popova Date: Mon, 20 Feb 2023 19:30:34 +0300 Subject: [PATCH] can use datetime.date as param in execute --- CHANGELOG.md | 2 ++ tests/aio/test_types.py | 4 ++-- ydb/types.py | 19 ++++++++++++++----- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d07e7ab..5c6c7bda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +* Fixed error while passing date parameter in execute + ## 2.12.2 ## * Fix error of check retriable error for idempotent operations (error exist since 2.12.1) diff --git a/tests/aio/test_types.py b/tests/aio/test_types.py index 17093896..2322e363 100644 --- a/tests/aio/test_types.py +++ b/tests/aio/test_types.py @@ -62,9 +62,9 @@ async def test_types(driver, database, value, ydb_type): @pytest.mark.parametrize( "value,ydb_type,result_value", [ - # FIXME: TypeError: 'datetime.date'/'datetime.datetime' object cannot be interpreted as an integer - # (test_today, 'Date', test_today), + # FIXME: TypeError: 'datetime.datetime' object cannot be interpreted as an integer # (test_dt_today, "Datetime", test_dt_today), + (test_today, "Date", test_today), (365, "Date", date(1971, 1, 1)), (3600 * 24 * 365, "Datetime", datetime(1971, 1, 1, 0, 0)), (test_td, "Interval", test_td), diff --git a/ydb/types.py b/ydb/types.py index 598a9013..a62c8a74 100644 --- a/ydb/types.py +++ b/ydb/types.py @@ -12,6 +12,7 @@ _SECONDS_IN_DAY = 60 * 60 * 24 _EPOCH = datetime(1970, 1, 1) + if six.PY3: _from_bytes = None else: @@ -20,13 +21,20 @@ def _from_bytes(x, table_client_settings): return _utilities.from_bytes(x) -def _from_date_number(x, table_client_settings): +def _from_date(x, table_client_settings): if ( table_client_settings is not None and table_client_settings._native_date_in_result_sets ): - return date.fromordinal(x + date(1970, 1, 1).toordinal()) - return x + return _EPOCH.date() + timedelta(days=x.uint32_value) + return x.uint32_value + + +def _to_date(pb, value): + if isinstance(value, date): + pb.uint32_value = (value - _EPOCH.date()).days + else: + pb.uint32_value = value def _from_datetime_number(x, table_client_settings): @@ -122,8 +130,9 @@ class PrimitiveType(enum.Enum): UUID = (_apis.primitive_types.UUID, None, _to_uuid, _from_uuid) Date = ( _apis.primitive_types.DATE, - "uint32_value", - _from_date_number, + None, + _from_date, + _to_date, ) Datetime = ( _apis.primitive_types.DATETIME,