Передавайте именованные аргументы в фабрики client и методы со множеством необязательных параметров.Методы, не описанные здесь, не считаются частью API и могут быть удалены или изменены.
Инициализация клиента
clickhouse_connect.get_client, чтобы создать синхронный Client, или установите дополнительный пакет async и вызовите clickhouse_connect.get_async_client с await, чтобы создать нативный AsyncClient.
Аргументы подключения
Асинхронная фабрика также принимает
connector_limit=100, connector_limit_per_host=20 и keepalive_timeout=30.0 для настройки пула соединений aiohttp. Она не принимает pool_mgr. Синхронное backend-соединение chDB принимает path и chdb_options; см. Встроенное backend-соединение chDB.
Аргументы HTTPS/TLS
Аргумент settings
settings для get_client используется для передачи серверу дополнительных настроек ClickHouse с каждым клиентским запросом. Обратите внимание, что в большинстве случаев пользователи с доступом readonly=1 не могут изменять настройки, передаваемые вместе с запросом, поэтому ClickHouse Connect отбрасывает такие настройки в итоговом запросе и записывает предупреждение в журнал. Следующие настройки применяются только к HTTP-запросам/сеансам, используемым ClickHouse Connect, и не документированы как общие настройки ClickHouse.
О других настройках ClickHouse, которые можно передавать с каждым запросом, см. в документации ClickHouse.
Примеры создания клиента
- Без параметров клиент ClickHouse Connect подключится к HTTP-порту по умолчанию на
localhostс пользователем по умолчаниюdefaultи без пароля:
- Подключение к защищённому (HTTPS) внешнему серверу ClickHouse
- Подключение с идентификатором сеанса, а также с другими пользовательскими параметрами подключения и настройками ClickHouse.
Встроенное backend-соединение chDB
clickhouse-connect[chdb], чтобы использовать экспериментальное backend-соединение chDB, работающее в процессе приложения. Оно предоставляет синхронные методы клиента: запросы, вставка, стриминг и методы Arrow:
path="/data/my_chdb" или используйте dsn="chdb:///data/my_chdb" для постоянного хранения данных. Это backend-соединение поддерживает только один путь к движку на процесс и не поддерживает get_async_client или внешние данные.
Жизненный цикл клиента и рекомендации
Основные принципы
- Повторно используйте клиенты: Создавайте клиенты один раз при запуске приложения и используйте их повторно в течение всего жизненного цикла приложения
- Избегайте частого создания: Не создавайте новый клиент для каждого запроса или обращения
- Корректно освобождайте ресурсы: Всегда закрывайте клиенты при завершении работы, чтобы освободить ресурсы пула соединений
- По возможности используйте совместно: Один клиент может обрабатывать множество параллельных запросов через свой пул соединений (см. примечания о потоках ниже)
Основные рекомендации
Многопоточные приложения
Правильная очистка
client.close() освобождает клиент и закрывает HTTP-соединения из пула только в том случае, если клиент управляет собственным менеджером пула (например, если он создан с пользовательскими параметрами TLS/прокси). Для общего пула по умолчанию используйте client.close_connections(), чтобы принудительно очистить сокеты; в противном случае соединения будут автоматически освобождены по истечении периода бездействия и при завершении процесса.
Когда использовать несколько клиентов
- Разные серверы: один клиент на каждый сервер ClickHouse или кластер
- Разные учетные данные: отдельные клиенты для разных пользователей или уровней доступа
- Разные базы данных: когда нужно работать с несколькими базами данных
- Изолированные сеансы: когда нужны отдельные сеансы для временных таблиц или настроек, специфичных для сеанса
- Изоляция на уровне потоков: когда потокам нужны независимые сеансы (как показано выше)
Общие аргументы методов
parameters и settings. Они описаны ниже.
Аргумент parameters
query* и command клиента ClickHouse Connect принимают необязательный именованный аргумент parameters, который используется для привязки выражений Python к выражению значения в ClickHouse. Доступны два типа привязки.
Привязка на стороне сервера
{<name>:<datatype>}. Передавайте значения в виде словаря Python.
Используйте Python None для допускающих NULL значений. Вложенные значения None поддерживаются внутри параметров Array и Tuple, а также внутри литералов Map, когда dict_parameter_format имеет значение "map".
- Привязка на стороне сервера со словарём Python, значением DateTime и строковым значением
Привязка на стороне клиента
parameters должен быть словарём или последовательностью. При привязке на стороне клиента для подстановки параметров используется форматирование строк Python в стиле “printf”.
Обратите внимание: в отличие от привязки на стороне сервера, привязка на стороне клиента не работает с идентификаторами баз данных, таблиц и столбцов, поскольку форматирование в стиле Python не различает разные типы строк, а для них требуется разное оформление (обратные кавычки или двойные кавычки для идентификаторов базы данных и одинарные кавычки для значений данных).
- Пример с Python-словарём, значением DateTime и экранированием строк
- Пример с последовательностью Python Sequence (Tuple), Float64 и IPv4Address
При привязке значения Для обратной совместимости имя параметра в словаре, оканчивающееся на
datetime без часового пояса интерпретируются как календарное время. Клиент форматирует datetime без часового пояса дословно. ClickHouse интерпретирует его в часовом поясе, объявленном в заполнителе на стороне сервера, например {dt:DateTime('Europe/Berlin')}, затем в session_timezone, если он задан, и наконец в часовом поясе сервера. datetime с часовым поясом преобразуется в часовой пояс, объявленный в заполнителе, если он указан, иначе — в часовой пояс сервера, полученный при подключении. Если настройка session_timezone отличается от полученного часового пояса сервера, укажите часовой пояс в заполнителе, чтобы сохранить нужный момент времени для значений с часовым поясом.Для временной совместимости с прежним преобразованием в локальный часовой пояс хоста задайте common.set_setting("naive_datetime_binding", "legacy") перед привязкой параметров. Чтобы сохранить момент времени, добавьте нужный tzinfo к значению datetime перед передачей его в качестве параметра. Вставки через client.insert по умолчанию интерпретируют значения datetime без часового пояса в локальном часовом поясе процесса. Задайте глобальную настройку naive_datetime_insert в значение "server", чтобы интерпретировать их как календарное время в часовом поясе столбца или в часовом поясе сервера, если у столбца он не задан. См. Объекты datetime без часового пояса.Для заполнителя {value:DateTime64(precision)} на стороне сервера объявленный тип автоматически сохраняет точность до долей секунды, в том числе внутри подсказок Array и Tuple.Привязка %s на стороне клиента не имеет объявленного типа. Оберните datetime в DT64Param, если его нужно выводить с точностью до долей секунды:_64, также включает форматирование DateTime64, если точное имя с этим суффиксом отсутствует в запросе.Параметры datetime.time и datetime.timedelta форматируются как литерал [-]HH:MM:SS[.ffffff] для столбцов ClickHouse Time и Time64 в обоих стилях привязки и внутри значений Array и Tuple. Кавычки добавляет клиент, поэтому не заключайте заполнитель в кавычки в запросе. Значение timedelta может быть отрицательным и превышать 24 часа. Timedelta из pandas сохраняет наносекунды и форматирует дробную часть из девяти цифр для Time64(9). Информация о часовом поясе в значении time с часовым поясом игнорируется, поскольку тип ClickHouse Time не поддерживает часовые пояса.аргумент settings
settings, который позволяет передавать пользовательские настройки сервера ClickHouse для данного SQL-оператора. Аргумент settings должен быть словарём. Каждый элемент должен содержать имя настройки ClickHouse и соответствующее ей значение. Обратите внимание, что при отправке на сервер в качестве параметров запроса значения будут преобразованы в строки.
Как и в случае с настройками на уровне клиента, ClickHouse Connect отбрасывает любые настройки, которые сервер помечает как readonly=1, с соответствующим сообщением в журнале. Настройки, применимые только к запросам через HTTP-интерфейс ClickHouse, всегда допустимы. Эти настройки описаны в API get_client.
Пример использования настроек ClickHouse:
Метод command клиента
Client.command для операторов, которые не возвращают табличный набор данных, или для запросов, которые возвращают одно примитивное значение или одну строку. В зависимости от ответа метод возвращает строку, целое число, последовательность строк или QuerySummary. Если чтение даёт пустой результирующий набор, возвращается пустая строка.
Примеры команд
DDL-операторы
Простые запросы, возвращающие одиночные значения
Команды с параметрами
Команды с настройками
Метод query клиента Client
Client.query получает табличный набор данных в Native format ClickHouse и возвращает QueryResult. Полный результат материализуется при обращении к его свойству. Для результатов, которые не следует хранить в памяти, используйте стриминговый метод.
Примеры запросов
Простой запрос
Доступ к результатам запроса
Запрос с параметрами на стороне клиента
Запрос с параметрами на стороне сервера
Запрос с настройками
Объект QueryResult
query возвращает объект QueryResult со следующими публичными свойствами:
result_rows— Матрица результатов, представленная в виде строк.result_columns— Матрица результатов, представленная в виде столбцов.result_set—result_rowsилиresult_columnsв зависимости от ориентации запроса.column_names— Кортеж имен столбцов результата.column_types— Кортеж объектовClickHouseType.row_count— Количество материализованных строк результата.query_id— Query id, указанный или сгенерированный для этого запроса. Пустая строка означает, что он недоступен.summary— Словарь, декодированный из заголовка ответаX-ClickHouse-Summary.first_item— Первая строка в виде словаря илиNoneдля пустого результата.first_row— Первая строка в виде последовательности илиNoneдля пустого результата.column_block_stream,row_block_streamиrows_stream— Внутренние контексты потоков. Вместо них используйте соответствующие стриминговые методы клиента.
StreamContext.
Получение результатов запросов с помощью NumPy, Pandas или Arrow
Методы потокового выполнения запросов в клиенте
Метод клиента insert
Client.insert. Он принимает следующие параметры:
Этот метод возвращает
QuerySummary. Его словарь summary содержит значения, сообщаемые сервером. written_rows — это удобное свойство, а written_bytes() и query_id() возвращают соответствующие значения. При ошибке вставки будет вызвано исключение.
Описание специализированных методов вставки, работающих с Pandas DataFrames, PyArrow Tables и DataFrames на базе Arrow, см. в разделе Расширенная вставка (Специализированные методы вставки).
Массив NumPy является допустимым Sequence of Sequences и может использоваться как аргумент
data для основного метода insert, поэтому специализированный метод не требуется.Примеры
users со схемой (id UInt32, name String, age UInt8).
Базовая построчная вставка
Вставка в столбцовом формате
Вставка с явным указанием типов столбцов
Вставка в определённую базу данных
Вставка из файлов
Raw API
Python DB-API 2.0
clickhouse_connect.dbapi реализует интерфейсы connection и cursor, определённые в PEP 249. Он объявляет уровень API 2.0, threadsafety=2 и paramstyle="pyformat". Модуль также предоставляет конструкторы типов PEP 249 Date, Time, Timestamp и Binary, а также функции DateFromTicks, TimeFromTicks и TimestampFromTicks.
Cursor.execute и Cursor.executemany принимают дополнительные именованные аргументы settings и query_formats. settings передаёт настройки ClickHouse. query_formats применяет форматы чтения по типам ClickHouse, когда оператор возвращает строки, используя то же сопоставление, что и Client.query. executemany использует реализованный в драйвере механизм массовой вставки Native для совместимых операторов INSERT ... VALUES с материализованной последовательностью строк. fetchone, fetchmany и fetchall считывают текущий материализованный результат.
Cursor.description определяет null_ok по типу каждого столбца результата. Типы, не допускающие NULL, возвращают False, а допускающие NULL — True, включая обёртки Nullable, Variant и Dynamic. None означает, что допустимость NULL неизвестна. Если запрос, начинающийся с SELECT или WITH без учёта начальных комментариев, не возвращает строк и метаданных столбцов, курсор выполняет запрос метаданных с LIMIT 0, чтобы заполнить description. Если этот запрос метаданных завершается с ошибкой, description остаётся пустым.
ClickHouse не поддерживает традиционные транзакции через этот HTTP-интерфейс. Connection.commit() и Connection.rollback() не выполняют никаких действий. Правила параллелизма для идентификатора сеанса по-прежнему действуют, если соединение используется совместно.
Вспомогательные классы и функции
clickhouse_connect.__version__.
Исключения
clickhouse_connect.driver.exceptions. DatabaseError и OperationalError предоставляют числовой атрибут code с кодом ошибки ClickHouse и атрибут name с символьным именем, например UNKNOWN_TABLE, поэтому приложения могут строить логику на основе exc.code, а не разбирать сообщение. code задается, даже если show_clickhouse_errors отключен, тогда как для name требуется отображение подробностей ошибки (True или "scrub"). Оба имеют значение None, когда недоступны, например при ошибках передачи данных. Используйте show_clickhouse_errors="scrub", когда конечные пользователи должны видеть ошибки SQL без информации о хосте или версии сервера. Этот параметр также управляет сообщениями StreamFailureError в процессе потоковой передачи и общими сообщениями об ошибках передачи данных. Он влияет только на str(exc). Ошибки передачи данных по-прежнему прикрепляются как __cause__, а трассировки стека могут содержать исходные сведения о хосте, URL или текст ошибки библиотеки.
Утилиты ClickHouse SQL
clickhouse_connect.driver.binding можно использовать для корректного формирования и экранирования запросов ClickHouse SQL. Аналогично, функции из модуля clickhouse_connect.driver.parser можно использовать для разбора названий типов данных ClickHouse.