multiquery¶
- @NativeDumper.multiquery¶
- Параметры:
dump_method (MethodType) – Метод, который будет обернут декоратором
- Результат:
Обернутая функция с поддержкой мультизапросов
- Тип результата:
Callable
Декоратор для выполнения сложных операций, состоящих из нескольких SQL-запросов и одной операции с данными в Native формате.
Описание:
Декоратор multiquery предназначен для обработки сложных сценариев загрузки данных,
которые требуют выполнения последовательности SQL-запросов до и/или после основной
операции с данными. Он автоматически разделяет комплексный запрос на части, выполняет
их в правильном порядке и обеспечивает корректное логирование прогресса.
Перед разделением запрос предварительно очищается через метод query_formatter
Типичные сценарии использования:
Создание временных таблиц перед загрузкой данных
Очистка данных после миграции
Агрегация результатов после основной загрузки
Подготовка среды для сложных ETL процессов
Валидация данных до и после операций
Как работает декоратор:
Разделение запроса - с помощью
chunk_query()запрос делится на две части: *first_part- запросы, выполняемые ДО основной операции *second_part- запросы, выполняемые ПОСЛЕ основной операцииВыполнение подготовительных запросов - все запросы из
first_partВыполнение основной операции - вызов обернутого метода (например,
read_dump)Выполнение завершающих запросов - все запросы из
second_partОчистка и обновление -
collect()иrefresh()
Параметры декоратора:
Параметр |
Тип |
Описание |
|---|---|---|
|
|
Метод NativeDumper, который будет обернут декоратором. |
Поддерживаемые методы:
Декоратор может применяться к следующим методам:
read_dump()- для комплексной выгрузки данныхwrite_between()- для комплексного переноса между серверамиto_reader()- для получения объектаNativeReader
Логирование прогресса:
Декоратор обеспечивает детальное логирование выполнения каждой части:
INFO: Execute query 1/4
INFO: Execute query 2/4
INFO: Execute stream 3/4 [native mode]
INFO: Execute query 4/4
INFO: Write into localhost.analytics.table done.
Разделение запросов:
Функция chunk_query() разделяет SQL-запрос на части по следующим правилам:
Разделитель - точка с запятой (
;)Первая часть - все запросы до Native операции
Вторая часть - все запросы после Native операции
Native операция - определяется по ключевым словам (
SELECT,INSERTи т.д.)
Пример разделения:
-- Исходный запрос
CREATE TABLE temp (id Int32); -- first_part[0]
SELECT * FROM source; -- Native операция
INSERT INTO dest SELECT * FROM temp; -- second_part[0]
DROP TABLE temp; -- second_part[1]
Обработка параметров:
Декоратор корректно обрабатывает различные комбинации параметров:
# Различные способы передачи запроса
@NativeDumper.multiquery
def process_data(dumper_inst, **kwargs):
return dumper_inst.read_dump(**kwargs)
# Вариант 1: query_src (для write_between)
process_data(
dumper,
fileobj=file,
query_src="CREATE TABLE...; SELECT...; DROP TABLE..."
)
# Вариант 2: query (для read_dump)
process_data(
dumper,
fileobj=file,
query="CREATE TABLE...; SELECT...; DROP TABLE..."
)
# Вариант 3: table_name (без запроса)
process_data(
dumper,
fileobj=file,
table_name="existing_table" # Простая загрузка всей таблицы
)
Особенности работы с курсорами:
Декоратор автоматически определяет, какой курсор использовать:
Локальный курсор - если используется
self.cursorВнешний курсор - если передан
dumper_srcв kwargs
# Пример: Использование внешнего dumper
@NativeDumper.multiquery
def cross_server_operation(dumper_inst, **kwargs):
return dumper_inst.write_between(**kwargs)
cross_server_operation(
dest_dumper,
table_dest="dest.table",
table_src="source.table",
dumper_src=src_dumper, # Курсор будет взят отсюда
query_src="TRUNCATE TABLE dest.table; ..."
)
Управление памятью:
После выполнения всех операций декоратор вызывает:
collect()- сборка мусора Pythonrefresh()- обновление сессии (только если операция успешна)
Примечания:
Декоратор не изменяет сигнатуру оборачиваемого метода
Все параметры передаются прозрачно через
*args, **kwargsРезультат обернутого метода возвращается как есть
Рекомендуется использовать для production ETL процессов
См. также:
read_dump - Чтение данных с поддержкой мультизапросов
write_between - Перенос данных с поддержкой мультизапросов
to_reader - Чтение данных из ClickHouse в виде объекта NativeReader
query_formatter - Форматирование и нормализация SQL-запросов для ClickHouse
chunk_query - Функция разделения SQL запросов