Передавайте именованные аргументы в фабрики client и методы со множеством необязательных параметров.Методы, не описанные здесь, не считаются частью API и могут быть удалены или изменены.
Инициализация клиента
Используйтеclickhouse_connect.get_client, чтобы создать синхронный Client, или установите дополнительный пакет async и вызовите clickhouse_connect.get_async_client с await, чтобы создать нативный AsyncClient.
Аргументы подключения
И синхронные, и асинхронные HTTP-фабрики преобразуют строковые значения из параметров запроса DSN или
generic_args для следующих параметров клиента: connect_timeout, send_receive_timeout, query_limit и query_retries приводятся к указанным выше числовым типам, а autogenerate_query_id, autogenerate_session_id и form_encode_query_params — к булевым значениям. Если строковое значение одного из этих параметров недопустимо, возникает исключение ProgrammingError.
Асинхронная фабрика также принимает connector_limit=100, connector_limit_per_host=20 и keepalive_timeout=30.0 для настройки пула соединений aiohttp. Их можно передать как именованные аргументы, как параметры запроса DSN или через generic_args, который внутренне используется для connect_args в SQLAlchemy. Строковые значения этих параметров коннектора преобразуются в числовые типы, указанные в документации. Если строковое значение одного из этих параметров недопустимо, возникает исключение ProgrammingError. Явно заданные именованные аргументы со значением, отличным от None, имеют приоритет над generic_args, а те, в свою очередь, — над DSN. Параметр 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 или внешние данные.
Жизненный цикл клиента и рекомендации
Создание клиента ClickHouse Connect — ресурсоемкая операция, включающая установление соединения, получение метаданных сервера и инициализацию настроек. Следуйте этим рекомендациям для оптимальной производительности:Основные принципы
- Повторно используйте клиенты: Создавайте клиенты один раз при запуске приложения и используйте их повторно в течение всего жизненного цикла приложения
- Избегайте частого создания: Не создавайте новый клиент для каждого запроса или обращения
- Корректно освобождайте ресурсы: Всегда закрывайте клиенты при завершении работы, чтобы освободить ресурсы пула соединений
- По возможности используйте совместно: Один клиент может обрабатывать множество параллельных запросов через свой пул соединений (см. примечания о потоках ниже)
Основные рекомендации
Повторно используйте один экземпляр клиента:Многопоточные приложения
Чтобы безопасно использовать один клиент в нескольких потоках:Правильная очистка
Всегда закрывайте клиенты при завершении работы. Обратите внимание:client.close() освобождает клиент и закрывает HTTP-соединения из пула только в том случае, если клиент управляет собственным менеджером пула (например, если он создан с пользовательскими параметрами TLS/прокси). Для общего пула по умолчанию используйте client.close_connections(), чтобы принудительно очистить сокеты; в противном случае соединения будут автоматически освобождены по истечении периода бездействия и при завершении процесса.
Когда использовать несколько клиентов
Несколько клиентов уместны в следующих случаях:- Разные серверы: один клиент на каждый сервер ClickHouse или кластер
- Разные учетные данные: отдельные клиенты для разных пользователей или уровней доступа
- Разные базы данных: когда нужно работать с несколькими базами данных
- Изолированные сеансы: когда нужны отдельные сеансы для временных таблиц или настроек, специфичных для сеанса
- Изоляция на уровне потоков: когда потокам нужны независимые сеансы (как показано выше)
Общие аргументы методов
В некоторых методах клиента используются один или оба стандартных именованных аргумента:parameters и settings. Они описаны ниже.
Аргумент parameters
Методы query* и command клиента ClickHouse Connect принимают необязательный именованный аргумент parameters, который используется для привязки выражений Python к выражению значения в ClickHouse. Доступны два типа привязки.
Привязка на стороне сервера
ClickHouse поддерживает привязку на стороне сервера для значений в запросе. Привязанное значение передаётся отдельно от запроса в виде HTTP-параметра. ClickHouse Connect использует этот режим, когда обнаруживает выражение в формате{<name>:<datatype>}. Передавайте значения в виде словаря Python.
Имена параметров должны быть ASCII-именами ClickHouse BareWord. Драйвер принимает $ в начале, внутри или в конце имени, если сервер допускает его использование, например {$tenant_id:String}. Ключ словаря, который начинается и заканчивается символом $ и содержит буферное значение, например bytes, bytearray или memoryview, зарезервирован для соглашения ClickHouse Connect об использовании необработанных двоичных параметров. Если такой ключ используется для небинарного параметра с привязкой на стороне сервера, используйте для него только один заполнитель {name:Type}. Повторяющиеся имена $tag$ могут быть разобраны ClickHouse как маркеры heredoc.
Используйте Python None для допускающих NULL значений. Вложенные значения None поддерживаются внутри параметров Array и Tuple, а также внутри литералов Map, когда dict_parameter_format имеет значение "map".
- Привязка на стороне сервера со словарём Python, значением DateTime и строковым значением
SELECT и операторами INSERT ... VALUES. Для вставки больших батчей обычных данных лучше использовать Client.insert.
Привязка на стороне клиента
ClickHouse Connect также поддерживает привязку параметров на стороне клиента, что дает больше гибкости при формировании шаблонизированных SQL-запросов. Для привязки на стороне клиента аргумент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 перед передачей его в качестве параметра. При вставке в столбцы DateTime или DateTime64 через client.insert значения datetime без часового пояса по умолчанию интерпретируются в локальном часовом поясе процесса. Задайте глобальную настройку naive_datetime_insert в значение "server", чтобы интерпретировать их как календарное время в часовом поясе столбца или в часовом поясе сервера, если у столбца он не задан. См. Объекты datetime без часового пояса.При нативной вставке в столбцы Date и Date32 используется календарная дата самого значения Python datetime, без преобразования часового пояса. Если одна и та же календарная дата нужна и для вставки, и для параметра запроса, явно передавайте value.date(). См. Значения Date и Date32.Для заполнителя {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
Все основные методы клиента ClickHouse Connect — “insert” и “select” — принимают необязательный именованный аргумент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. Полный результат материализуется при обращении к его свойству. Для результатов, которые не следует хранить в памяти, используйте стриминговый метод.
Если клиент обнаруживает в конце запроса
LIMIT 0, он запрашивает метаданные столбцов в формате JSON. Если ответ содержит строки, клиент выбрасывает исключение clickhouse_connect.driver.exceptions.InternalError и не выполняет запрос повторно. Такое возможно с запросами UNION, EXCEPT или EXPLAIN, заканчивающимися на LIMIT 0.Для таких запросов используйте raw_query с выходным форматом, например fmt="JSON". Метод возвращает bytes, которые ваше приложение должно декодировать самостоятельно. Это поведение распространяется на синхронные и асинхронные HTTP-клиенты, а также на клиенты chDB.Примеры запросов
Простой запрос
Доступ к результатам запроса
Запрос с параметрами на стороне клиента
Запрос с параметрами на стороне сервера
Запрос с настройками
Объект 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
ClickHouse Connect предоставляет специализированные методы запросов для форматов данных NumPy, Pandas и Arrow. Подробную информацию об использовании этих методов, включая примеры, возможности стриминга и расширенную обработку типов, см. в разделе Расширенное выполнение запросов (запросы NumPy, Pandas и Arrow).Методы потокового выполнения запросов в клиенте
Для потоковой передачи больших результирующих наборов ClickHouse Connect предоставляет несколько методов. Подробности и примеры см. в разделе Расширенные запросы (потоковые запросы).Метод клиента insert
Для типичного сценария вставки нескольких записей в ClickHouse предусмотрен метод 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).
Базовая построчная вставка
Вставка в столбцовом формате
Вставка с явным указанием типов столбцов
Вставка в определённую базу данных
Вставка из файлов
Чтобы напрямую вставлять данные из файлов в таблицы ClickHouse, см. Расширенная вставка (вставка из файлов).Raw API
Для продвинутых сценариев, требующих прямого доступа к HTTP-интерфейсам ClickHouse без преобразования типов, см. Расширенное использование (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.
Модуль экспортирует иерархию исключений PEP 249: Warning, Error, InterfaceError, DatabaseError, DataError, OperationalError, IntegrityError, InternalError, ProgrammingError и NotSupportedError. Это те же объекты классов, что и в clickhouse_connect.driver.exceptions, поэтому ошибки драйвера можно перехватывать, импортируя их из любого из этих модулей. Специфичное для драйвера исключение StreamFailureError по-прежнему доступно в clickhouse_connect.driver.exceptions и является подклассом OperationalError.
Cursor.execute и Cursor.executemany принимают дополнительные именованные аргументы settings и query_formats. settings передаёт настройки ClickHouse. query_formats применяет форматы чтения по типам ClickHouse, когда оператор возвращает строки, используя то же сопоставление, что и Client.query. Оба метода также принимают доступный только по имени аргумент pyformat_encoded. Его значение по умолчанию True соответствует контракту DB-API pyformat. Диалект SQLAlchemy устанавливает его в False, когда компилятор оператора генерирует необработанные знаки процента, поэтому приложениям обычно не следует задавать его. Параметризованные операции Cursor.executemany выполняются по одному разу для каждого набора параметров, сохраняя семантику привязки SQL и вычисления выражений. При работе через HTTP для каждого набора параметров отправляется отдельный запрос. Если один из последующих наборов параметров завершается с ошибкой, уже выполненные записи остаются закоммиченными. Для таких вставок через executemany значение Cursor.rowcount равно сумме значений written_rows, возвращённых ClickHouse, или -1, если это значение недоступно. Для операторов INSERT, отправленных через Cursor.execute, возвращается 0. Форма совместимости INSERT INTO table (columns) VALUES без плейсхолдеров использует нативную вставку. Оператор INSERT без плейсхолдеров, заканчивающийся на VALUES, вызывает ProgrammingError, если его не удаётся распознать как эту форму совместимости. Приложениям, которым требуется явная массовая вставка в формате Native, следует использовать Client.insert. 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__.
Исключения
Пользовательские исключения, включая иерархию исключений DB-API 2.0, повторно экспортируемую модулемclickhouse_connect.dbapi, определены в 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
Функции и класс DT64Param в модулеclickhouse_connect.driver.binding можно использовать для корректного формирования и экранирования запросов ClickHouse SQL. Аналогично, функции из модуля clickhouse_connect.driver.parser можно использовать для разбора названий типов данных ClickHouse.