Raw API
Метод клиента raw_query
Client.raw_query позволяет напрямую использовать HTTP-интерфейс запросов ClickHouse через клиентское соединение. Возвращаемое значение — необработанный объект bytes. Этот метод предоставляет удобную обёртку с привязкой параметров, обработкой ошибок, повторными попытками и управлением настройками через минимальный интерфейс:
| Parameter | Type | Default | Description |
|---|---|---|---|
| query | str | Required | Любой допустимый запрос к ClickHouse |
| parameters | dict or iterable | None | См. описание параметров. |
| settings | dict | None | См. описание настроек. |
| fmt | str | None | Выходной формат ClickHouse для результирующего объекта bytes. (Если формат не указан, ClickHouse использует TSV) |
| use_database | bool | True | Использовать назначенную клиенту ClickHouse Connect базу данных в контексте запроса |
| external_data | ExternalData | None | Объект ExternalData, содержащий файловые или бинарные данные для использования в запросе. См. Расширенные запросы (External Data) |
bytes остаётся на стороне вызывающего кода. Обратите внимание, что Client.query_arrow — это лишь простая обёртка над этим методом, использующая выходной формат ClickHouse Arrow.
Метод raw_stream клиента
Client.raw_stream имеет тот же API, что и метод raw_query, но возвращает объект io.IOBase, который можно использовать как генератор или источник потока объектов bytes. В настоящее время он используется в методе query_arrow_stream.
Метод клиента raw_insert
Client.raw_insert позволяет выполнять прямую вставку объектов bytes или генераторов объектов bytes через клиентское соединение. Поскольку он никак не обрабатывает полезную нагрузку вставки, он обеспечивает очень высокую производительность. Метод предоставляет параметры для указания настроек и формата вставки:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
| table | str | Обязательно | Простое имя таблицы или имя таблицы с указанием базы данных |
| column_names | Sequence[str] | None | Имена столбцов для блока вставки. Обязательно, если параметр fmt не включает имена |
| insert_block | str, bytes, Generator[bytes], BinaryIO | Обязательно | Данные для вставки. Строки будут закодированы с использованием кодировки клиента. |
| settings | dict | None | См. описание настроек. |
| fmt | str | None | Входной формат ClickHouse для байтов insert_block. (Если формат не указан, ClickHouse использует TSV) |
insert_block соответствовал указанному формату и использовал указанный метод сжатия, лежит на вызывающей стороне. ClickHouse Connect использует такие необработанные вставки для загрузки файлов и таблиц PyArrow, делегируя их разбор ClickHouse server.
Сохранение результатов запроса в файлы
raw_stream можно напрямую в потоковом режиме записывать файлы из ClickHouse в локальную файловую систему. Например, если вы хотите сохранить результаты запроса в CSV-файл, можно использовать следующий фрагмент кода:
output.csv со следующим содержимым:
Сценарии использования в многопоточных, многопроцессных и асинхронных/работающих на цикле событий приложениях
QueryContext или InsertContext соответственно, эти вспомогательные объекты не являются потокобезопасными и не должны совместно использоваться между несколькими потоками обработки. Дополнительные сведения об объектах контекста см. в разделах QueryContexts и InsertContexts.
Кроме того, в приложении, где одновременно выполняются два или более запроса и/или вставки, нужно учитывать еще два момента. Первый — это clickHouse-«сеанс», связанный с запросом или вставкой, а второй — пул HTTP-соединений, используемый экземплярами клиента ClickHouse Connect.
Обёртка для AsyncClient
Client, чтобы его можно было использовать в среде asyncio.
Чтобы получить экземпляр AsyncClient, можно воспользоваться фабричной функцией get_async_client, которая принимает те же параметры, что и стандартная get_client:
AsyncClient имеет те же методы и параметры, что и стандартный Client, но там, где это применимо, они являются корутинами. Внутри методы Client, выполняющие операции I/O, оборачиваются в вызов run_in_executor.
При использовании обёртки AsyncClient многопоточная производительность повышается, поскольку потоки выполнения и GIL освобождаются во время ожидания завершения операций I/O.
Примечание: в отличие от обычного Client, в AsyncClient параметр autogenerate_session_id по умолчанию принудительно устанавливается в False.
См. также: пример run_async.
Управление идентификаторами сеансов ClickHouse
- Чтобы связывать определённые настройки ClickHouse с несколькими запросами (см. настройки пользователя). Команда ClickHouse
SETиспользуется для изменения настроек в рамках пользовательского сеанса. - Для отслеживания временных таблиц
Client из ClickHouse Connect, использует идентификатор сеанса этого клиента. Операторы SET и временные таблицы работают ожидаемым образом при использовании одного клиента. Однако ClickHouse server не допускает одновременное выполнение запросов в рамках одного и того же сеанса (при такой попытке клиент вызовет ProgrammingError). Для приложений, которые выполняют запросы параллельно, используйте один из следующих подходов:
- Создайте отдельный экземпляр
Clientдля каждого thread/process/event handler, которому требуется изоляция сеанса. Это сохраняет состояние сеанса на уровне клиента (временные таблицы и значенияSET). - Используйте уникальный
session_idдля каждого запроса через аргументsettingsпри вызовеquery,commandилиinsert, если вам не требуется общее состояние сеанса. - Отключите сеансы для общего клиента, установив
autogenerate_session_id=Falseперед созданием клиента (или передайте его напрямую вget_client).
autogenerate_session_id=False напрямую в get_client(...).
В этом случае ClickHouse Connect не отправляет session_id; сервер не считает отдельные запросы частью одного и того же сеанса. Временные таблицы и настройки уровня сеанса не будут сохраняться между запросами.
Настройка пула HTTP-соединений
urllib3 для управления базовыми HTTP-соединениями с сервером. По умолчанию все экземпляры клиента используют общий пул соединений, чего достаточно для большинства сценариев. Этот пул по умолчанию поддерживает до 8 HTTP Keep-Alive-соединений с каждым сервером ClickHouse, используемым приложением.
Для крупных многопоточных приложений может быть целесообразно использовать отдельные пулы соединений. Настроенные пулы соединений можно передать в основную функцию clickhouse_connect.get_client через именованный аргумент pool_mgr:
urllib3.