с кликом. Задача простая - просто пулять insert as select from s3 и отслеживать чтобы этот запрос успешно выполнился
Сначала делал через def execute(self, query
, но оно получается раьотает даже если сам запрос на сервере отработал и падает только по таймауту. Те как будто не отслеживает статус выполнения запроса в клике.
Далее заюзал def execute_with_progress(
который возвращает tuple с кол-вом обоаботанных строк + общим количеством строк. И вроде то что нужно и можно сделать cancel клиенту если num_rows = processed rows вроде такого
for num_rows, total_rows in progress:
print(f"{num_rows} was processed from {total_rows}")
, но меня смущает что мне эта функция вот такое возвращает
319237761065 was processed from 319235351580
319237772198 was processed from 319235351580
Ну те как кол-во строк может больше итоговых? )
Конечно можно поставить условие num_rows >= processed_rows но как-то очково и не остановлю ли я запрос раньше времени в таком случае
Я сделал такой тайм-аут {"send_receive_timeout": 18000} и больше не парился с execute
Так у меня висит он пока не отвалится
Количество строк, в случае execute_with_progress, емнип, приблизительное. То есть сам сервер так возвращает. С s3, честно говоря, не тестил. Но поскольку это всё на стороне сервера происходит, думаю разницы особой не должно быть. Если скинете сниппеты как это воспроизвести, то потыкаю на досуге
я просто дергал INSERT SELECT который долгий (необязательно загрузку с S3) вот так: self.client.execute(query=sql_query, settings={'connect_timeout': 3000, 'send_receive_timeout': 1500}) Клиент объявлял вот так: self.client = Client( host=self.job_config['host'], port=self.job_config['port'], user=self.credentials['user'], password=self.credentials['password'], database=self.job_config['db'] ) При маленьком таймауте он обрывал соединение по запрос на сервере продолжал крутиться. При большом таймауте код продолжал работать даже после того как запрос на сервере отработал и его не видно в system.process progress = self.client.execute_with_progress(query) for num_rows, total_rows in progress: print(f"{num_rows} was processed from {total_rows}") такой вот код тоже не заканчивается и продолжает работать даже когда у нас все строки обработаны (это видно по сообщениям) Версии: Python 3.8.12 clickhouse-driver==0.2.4 Версия КХ: 22.9.3.18
Обсуждают сегодня