From 97c797456e5aa53431d9876f04e9377f191e279d Mon Sep 17 00:00:00 2001 From: Filipp Ozinov Date: Thu, 5 Dec 2024 01:05:43 +0400 Subject: [PATCH] Fixed parsing dates --- mysql_ch_replicator/clickhouse_api.py | 5 +++++ test_mysql_ch_replicator.py | 12 +++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/mysql_ch_replicator/clickhouse_api.py b/mysql_ch_replicator/clickhouse_api.py index 510a368..6dd3e6c 100644 --- a/mysql_ch_replicator/clickhouse_api.py +++ b/mysql_ch_replicator/clickhouse_api.py @@ -129,6 +129,11 @@ def insert(self, table_name, records, table_structure: TableStructure = None): for record in records: new_record = [] for i, e in enumerate(record): + if isinstance(e, datetime.date) and not isinstance(e, datetime.datetime): + try: + e = datetime.datetime.combine(e, datetime.time()) + except ValueError: + e = datetime.datetime(1970, 1, 1) if isinstance(e, datetime.datetime): try: e.timestamp() diff --git a/test_mysql_ch_replicator.py b/test_mysql_ch_replicator.py index a99bdbf..a14b1e9 100644 --- a/test_mysql_ch_replicator.py +++ b/test_mysql_ch_replicator.py @@ -562,12 +562,14 @@ def test_datetime_exception(): id int NOT NULL AUTO_INCREMENT, name varchar(255), modified_date DateTime(3) NOT NULL, + test_date date NOT NULL, PRIMARY KEY (id) ); ''') mysql.execute( - f"INSERT INTO {TEST_TABLE_NAME} (name, modified_date) VALUES ('Ivan', '0000-00-00 00:00:00');", + f"INSERT INTO {TEST_TABLE_NAME} (name, modified_date, test_date) " + f"VALUES ('Ivan', '0000-00-00 00:00:00', '2015-05-28');", commit=True, ) @@ -584,14 +586,18 @@ def test_datetime_exception(): assert_wait(lambda: len(ch.select(TEST_TABLE_NAME)) == 1) mysql.execute( - f"INSERT INTO {TEST_TABLE_NAME} (name, modified_date) VALUES ('Alex', '0000-00-00 00:00:00');", + f"INSERT INTO {TEST_TABLE_NAME} (name, modified_date, test_date) " + f"VALUES ('Alex', '0000-00-00 00:00:00', '2015-06-02');", commit=True, ) mysql.execute( - f"INSERT INTO {TEST_TABLE_NAME} (name, modified_date) VALUES ('Givi', '2023-01-08 03:11:09');", + f"INSERT INTO {TEST_TABLE_NAME} (name, modified_date, test_date) " + f"VALUES ('Givi', '2023-01-08 03:11:09', '2015-06-02');", commit=True, ) assert_wait(lambda: len(ch.select(TEST_TABLE_NAME)) == 3) + assert_wait(lambda: str(ch.select(TEST_TABLE_NAME, where="name='Alex'")[0]['test_date']) == '2015-06-02') + assert_wait(lambda: str(ch.select(TEST_TABLE_NAME, where="name='Ivan'")[0]['test_date']) == '2015-05-28') def test_different_types_1():