query_formatter¶
- NativeDumper.query_formatter(query)¶
- Параметры:
query (str) – SQL-запрос для форматирования
- Результат:
Отформатированный SQL-запрос или
Noneесли запрос пустой- Тип результата:
str | None
Форматирование и нормализация SQL-запросов для ClickHouse.
Описание:
Метод выполняет очистку и форматирование SQL-запросов с использованием библиотеки
sqlparse. Он удаляет комментарии, лишние пробелы и точки с запятой в конце запроса,
приводя запрос к стандартизированному виду.
Что делает метод:
Проверяет входные данные - возвращает
Noneдля пустых запросовУдаляет комментарии - убирает однострочные (
--) и многострочные (/* */) комментарииФорматирует SQL - приводит к стандартному форматированию
Удаляет лишние символы - убирает пробелы и точки с запятой в начале/конце
Возвращает чистый запрос - готовый к использованию в ClickHouse
Параметры:
Параметр |
Тип |
Описание |
|---|---|---|
|
|
SQL-запрос для форматирования. Может содержать комментарии и лишние пробелы. |
Возвращаемое значение:
str- отформатированный SQL-запрос без комментариев и лишних символовNone- если входной запрос пустой (None,"", или состоящий только из пробелов)
Примеры использования:
# Пример 1: Базовое форматирование запроса
from native_dumper import NativeDumper
dumper = NativeDumper(connector)
raw_query = """
SELECT -- это комментарий
id,
name,
/* многострочный
комментарий */
age
FROM users
WHERE active = 1;
"""
formatted = dumper.query_formatter(raw_query)
print(formatted)
# Вывод:
# SELECT id,
# name,
# age
# FROM users
# WHERE active = 1
# Пример 2: Форматирование сложного запроса
complex_query = """
INSERT INTO analytics.events
SELECT
user_id,
event_type,
toDateTime(timestamp) AS event_time,
JSONExtractString(properties, 'page') AS page,
count() OVER (PARTITION BY user_id ORDER BY timestamp) AS event_seq
FROM raw.events
WHERE timestamp >= '2024-01-01'
AND timestamp < '2024-02-01'
AND event_type IN ('page_view', 'click', 'submit')
GROUP BY user_id, event_type, timestamp, properties
ORDER BY timestamp DESC
LIMIT 1000;
"""
formatted = dumper.query_formatter(complex_query)
print("Отформатированный запрос:")
print(formatted)
# Пример 3: Обработка пустых запросов
from native_dumper import NativeDumper
dumper = NativeDumper(connector)
# Пустые запросы возвращают None
empty_result = dumper.query_formatter("")
print(f"Пустая строка: {empty_result}") # None
null_result = dumper.query_formatter(None)
print(f"None: {null_result}") # None
whitespace_result = dumper.query_formatter(" \n \t ")
print(f"Пробелы: {whitespace_result}") # None
# Пример 4: Использование в цепочке методов
from native_dumper import NativeDumper, CHConnector
connector = CHConnector(host="localhost", port=8123)
dumper = NativeDumper(connector)
# Запрос с форматированием перед выполнением
user_query = "select * from users where active=1; -- активные пользователи"
# Форматируем и выполняем
clean_query = dumper.query_formatter(user_query)
if clean_query:
# Использование в cursor.execute()
result = dumper.cursor.execute(clean_query)
print(f"Найдено {len(result)} записей")
else:
print("Запрос пустой, выполнение пропущено")
# Пример 5: Интеграция с write_between
raw_query = """
/* Выборка данных для миграции */
SELECT
id::UInt64 as user_id,
email,
created_at::DateTime as registration_date,
CASE
WHEN status = 'active' THEN 1
ELSE 0
END as is_active
FROM postgres.public.users -- исходная таблица
WHERE created_at >= '2023-01-01'
ORDER BY id;
"""
# Форматирование перед использованием
clean_query = dumper.query_formatter(raw_query)
# Использование в write_between
success = dumper.write_between(
table_dest="clickhouse.users",
query_src=clean_query,
dumper_src=source_dumper
)
Преобразования, выполняемые методом:
Входной запрос |
Результат форматирования |
|---|---|
|
|
|
|
`` SELECT * FROM t WHERE x=1 ; `` |
|
|
|
|
|
Внутренняя работа метода:
Метод использует функцию sqlparse.format() со следующими параметрами:
# Эквивалент внутренней реализации
from sqlparse import format as sql_format
def query_formatter(query):
if not query:
return None
# Основные параметры форматирования:
formatted = sql_format(
sql=query,
strip_comments=True, # Удаление комментариев
reindent=True, # Автоматический отступ
keyword_case='upper', # Ключевые слова в верхнем регистре
use_space_around_operators=True, # Пробелы вокруг операторов
indent_width=2, # Ширина отступа
wrap_after=80 # Перенос строк после 80 символов
)
# Дополнительная очистка
return formatted.strip().strip(";")
Использование в других методах NativeDumper:
Метод query_formatter используется внутренне в других методах для
обеспечения корректности SQL-запросов:
read_dump() - форматирование запросов для выборки данных
write_between() - нормализация SQL для источника данных
to_reader() - подготовка запросов для потокового чтения
См. также:
read_dump - Метод, использующий форматирование запросов для выборки
write_between - Использование SQL-запросов для переноса данных