Инициализация клиента
Используйте clickhouse_connect.get_client, чтобы создать синхронный Client, или установите дополнительный пакет async и вызовите clickhouse_connect.get_async_client с await, чтобы создать нативный AsyncClient.
Аргументы подключения
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
interface |
str | "http" |
"http" или "https". Синхронная фабрика также поддерживает экспериментальный бэкенд "chdb". |
хост |
str | "localhost" |
Хост или IP-адрес сервера ClickHouse. |
port |
int или None | 8123 или 8443 |
По умолчанию используется 8123 для HTTP и 8443 для HTTPS. Передача None означает использование значения по умолчанию. |
username |
str или None | "default" |
Имя пользователя ClickHouse. Также принимаются псевдонимы user и user_name. |
password |
str | "" |
Пароль для username. Не сочетайте аутентификацию по имени пользователя и паролю с аутентификацией по токену. |
access_token |
str или None | None |
JWT-токен доступа к ClickHouse Cloud. Взаимоисключает использование token_provider и аутентификации по имени пользователя и паролю. |
token_provider |
callable или None | None |
Вызываемый объект, который предоставляет JWT при первоначальной аутентификации и после её отклонения. Асинхронный провайдер можно использовать с get_async_client. |
database |
str или None | По умолчанию для пользователя | База данных по умолчанию. При передаче None запрашивается база данных по умолчанию для пользователя на сервере. |
secure |
bool или str | False |
Включает HTTPS/TLS. interface="https" также включает HTTPS; то же самое происходит при использовании порта 443 или 8443, если interface не задан. |
dsn |
str или None | None |
URL подключения. Явные именованные аргументы имеют старшинство над значениями, разобранными из DSN. Используйте процентное кодирование для зарезервированных символов в учетных данных и именах баз данных. |
settings |
dict или None | None |
Настройки ClickHouse, применяемые ко всем запросам, отправляемым клиентом. |
headers |
dict or None | None |
HTTP-заголовки, применяемые ко всем запросам, включая инициализацию клиента. Пользовательские заголовки применяются после заголовков драйвера по умолчанию и могут их переопределять. |
compress |
bool or str | True |
Включите сжатие или укажите "lz4", "zstd", "br" или "gzip". См. раздел Сжатие. |
query_limit |
int | 0 |
Ограничение числа строк по умолчанию, добавляемое к подходящим запросам. Ноль означает отсутствие ограничений. Для больших результатов используйте потоковую передачу вместо материализации всего в памяти. |
query_retries |
int | 2 |
Количество повторных попыток при ошибках чтения, допускающих повтор. Команды и операции вставки обычно не повторяются, поскольку повторное выполнение может привести к дублированию побочных эффектов. |
connect_timeout |
int | 10 |
Тайм-аут подключения в секундах. |
send_receive_timeout |
int | 300 |
Тайм-аут чтения из сокета в секундах. |
client_name |
str или None | None |
Префикс, добавляемый к HTTP User-Agent для идентификации в system.query_log. |
session_id |
str или None | Генерируется для синхронных клиентов | Явно заданный ID сеанса ClickHouse. У синхронных клиентов он генерируется по умолчанию; у async-клиентов — нет. |
autogenerate_session_id |
bool или None | Глобальная настройка для синхронных клиентов, False — для async-клиентов |
Переопределяет автоматическую генерацию ID сеанса. Если состояние сеанса не требуется, отключите это для клиента, используемого несколькими параллельными операциями. |
autogenerate_query_id |
bool или None | Глобальная настройка, True |
Переопределяет автоматическую генерацию Query id в формате UUID. |
http_proxy |
str или None | Переменная окружения/по умолчанию | Адрес HTTP-прокси для клиента. |
https_proxy |
str или None | Переменная окружения/по умолчанию | Адрес HTTPS-прокси для каждого клиента. |
pool_mgr |
urllib3.PoolManager или None |
Общее значение по умолчанию | Пользовательский менеджер пула только для синхронного клиента. |
tz_source |
str или None | "auto" |
Резервный источник часового пояса для столбцов без метаданных часового пояса: "auto", "server" или "local". |
tz_mode |
str или None | "naive_utc" |
Политика представления результатов в UTC: "naive_utc", "aware" или "schema". См. Часовые пояса. |
show_clickhouse_errors |
bool, булева строка, "scrub" или None |
True |
Управляет str(exc) для ошибок сервера, транспортных ошибок и StreamFailureError в середине потока. True включает URL запроса и завершающую информацию о версии сервера. "scrub" сохраняет текст SQL-ошибки и символьное имя, но удаляет хост/URL и завершающую часть (version ...). False возвращает общее сообщение (code по-прежнему задаётся для ошибок сервера). Булевы строки допустимы. Другие строки вызывают ProgrammingError. Для транспортных ошибок __cause__ и трассировки стека по-прежнему содержат исходное транспортное исключение. |
proxy_path |
str | "" |
Префикс пути, добавляемый к URL сервера при маршрутизации через proxy. |
form_encode_query_params |
bool | False |
Всегда помещать параметры запроса в тело HTTP-запроса в формате form-encoded. Крупные полезные нагрузки небинарных параметров автоматически переносятся туда, даже если это значение равно false. |
rename_response_column |
str или None | None |
Стратегия переименования столбцов: "remove_prefix", "to_camelcase", "to_camelcase_without_prefix", "to_underscore" или "to_underscore_without_prefix". |
Асинхронная фабрика также принимает connector_limit=100, connector_limit_per_host=20 и keepalive_timeout=30.0 для настройки пула соединений aiohttp. Она не принимает pool_mgr. Синхронное backend-соединение chDB принимает path и chdb_options; см. Встроенное backend-соединение chDB.
Аргументы HTTPS/TLS
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
verify |
bool or str | True |
Проверяет сертификат сервера и имя хоста. verify="proxy" включает режим прокси TLS. |
ca_cert |
str or None | None |
Путь к набору CA. Используйте "certifi", чтобы выбрать набор, поставляемый с пакетом certifi. |
client_cert |
str or None | None |
PEM-сертификат клиента, включая промежуточные сертификаты, если это требуется. |
client_cert_key |
str or None | None |
Путь к закрытому ключу, если ключ не включён в client_cert. |
server_host_name |
str or None | None |
Имя хоста TLS-сертификата/SNI, если оно отличается от host, например при использовании туннеля или частной конечной точки. |
tls_mode |
str or None | None |
"mutual" использует аутентификацию ClickHouse по схеме взаимного TLS. "proxy" и "strict" передают сертификат на уровне TLS без включения заголовков аутентификации ClickHouse по сертификату. Значение по умолчанию None ведёт себя как "mutual", если предоставлен сертификат клиента. |
Аргумент settings
Наконец, аргумент settings для get_client используется для передачи серверу дополнительных настроек ClickHouse с каждым клиентским запросом. Обратите внимание, что в большинстве случаев пользователи с доступом readonly=1 не могут изменять настройки, передаваемые вместе с запросом, поэтому ClickHouse Connect отбрасывает такие настройки в итоговом запросе и записывает предупреждение в журнал. Следующие настройки применяются только к HTTP-запросам/сеансам, используемым ClickHouse Connect, и не документированы как общие настройки ClickHouse.
| Setting | Описание |
|---|---|
buffer_size |
Размер буфера HTTP-ответа на стороне сервера в байтах. |
session_id |
Идентификатор сеанса, используемый для связывания связанных запросов. Требуется для временных таблиц и состояния сеанса. |
compress |
Указывает серверу сжимать HTTP-ответ. Обычно управляется параметром сжатия клиента. |
decompress |
Указывает серверу распаковывать тело запроса. Используется для предварительно сжатых raw-вставок. |
quota_key |
Ключ квоты, связанный с запросом. |
session_check |
Указывает серверу проверить существование сеанса. |
session_timeout |
Тайм-аут неактивности сеанса в секундах. |
wait_end_of_query |
Буферизует полный ответ на сервере. Клиент устанавливает этот параметр при необходимости для нестриминговой сводной информации. |
query_id |
Явный Query id для запроса. |
client_protocol_version |
Уровень возможностей клиентского протокола в native-формате. Обычно согласовывается автоматически. |
role |
Роль ClickHouse для использования в запросе/сеансе. |
О других настройках ClickHouse, которые можно передавать с каждым запросом, см. в документации ClickHouse.
Примеры создания клиента
- Без параметров клиент ClickHouse Connect подключится к HTTP-порту по умолчанию на
localhostс пользователем по умолчаниюdefaultи без пароля:
import clickhouse_connect
client = clickhouse_connect.get_client()
print(client.server_version)- Подключение к защищённому (HTTPS) внешнему серверу ClickHouse
import clickhouse_connect
client = clickhouse_connect.get_client(
host="play.clickhouse.com",
secure=True,
port=443,
username="play",
password="clickhouse",
)
print(client.command("SELECT timezone()"))- Подключение с идентификатором сеанса, а также с другими пользовательскими параметрами подключения и настройками ClickHouse.
import clickhouse_connect
client = clickhouse_connect.get_client(
host="play.clickhouse.com",
username="play",
password="clickhouse",
port=443,
secure=True,
session_id="example_session_1",
connect_timeout=15,
database="github",
settings={"distributed_ddl_task_timeout": 300},
)
print(client.database)
# Output: githubВстроенное backend-соединение chDB
Установите clickhouse-connect[chdb], чтобы использовать экспериментальное backend-соединение chDB, работающее в процессе приложения. Оно предоставляет синхронные методы клиента: запросы, вставка, стриминг и методы Arrow:
import clickhouse_connect
with clickhouse_connect.get_client(interface="chdb") as client:
result = client.query("SELECT sum(number) FROM numbers(10)")
print(result.first_row)
# Output: (45,)По умолчанию используется база данных в оперативной памяти. Передайте path="/data/my_chdb" или используйте dsn="chdb:///data/my_chdb" для постоянного хранения данных. Это backend-соединение поддерживает только один путь к движку на процесс и не поддерживает get_async_client или внешние данные.
Жизненный цикл клиента и рекомендации
Создание клиента ClickHouse Connect — ресурсоемкая операция, включающая установление соединения, получение метаданных сервера и инициализацию настроек. Следуйте этим рекомендациям для оптимальной производительности:
Основные принципы
- Повторно используйте клиенты: Создавайте клиенты один раз при запуске приложения и используйте их повторно в течение всего жизненного цикла приложения
- Избегайте частого создания: Не создавайте новый клиент для каждого запроса или обращения
- Корректно освобождайте ресурсы: Всегда закрывайте клиенты при завершении работы, чтобы освободить ресурсы пула соединений
- По возможности используйте совместно: Один клиент может обрабатывать множество параллельных запросов через свой пул соединений (см. примечания о потоках ниже)
Основные рекомендации
Повторно используйте один экземпляр клиента:
import clickhouse_connect
# Create once at startup
client = clickhouse_connect.get_client(
host="my-host",
username="default",
password="password",
)
# Reuse for all queries
for i in range(1000):
result = client.query("SELECT count() FROM users")
# Close on shutdown
client.close()Избегайте повторного создания клиентов:
# BAD: Creates 1000 clients with expensive initialization overhead
for i in range(1000):
client = clickhouse_connect.get_client(
host="my-host",
username="default",
password="password",
)
result = client.query("SELECT count() FROM users")
client.close()Многопоточные приложения
Чтобы безопасно использовать один клиент в нескольких потоках:
import clickhouse_connect
import threading
# Option 1: Disable sessions (recommended for shared clients)
client = clickhouse_connect.get_client(
host="my-host",
username="default",
password="password",
autogenerate_session_id=False,
)
def worker(thread_id):
# All threads can now safely use the same client
result = client.query(f"SELECT {thread_id}")
print(f"Thread {thread_id}: {result.result_rows[0][0]}")
threads = [threading.Thread(target=worker, args=(i,)) for i in range(10)]
for t in threads:
t.start()
for t in threads:
t.join()
client.close()Альтернатива при использовании сеансов: Если вам нужны сеансы (например, для временных таблиц), создайте отдельный клиент для каждого потока:
def worker(thread_id):
# Each thread gets its own client with isolated session
client = clickhouse_connect.get_client(
host="my-host",
username="default",
password="password",
)
client.command("CREATE TEMPORARY TABLE temp (id UInt32) ENGINE = Memory")
# ... use temp table ...
client.close()Правильная очистка
Всегда закрывайте клиенты при завершении работы. Обратите внимание: client.close() освобождает клиент и закрывает HTTP-соединения из пула только в том случае, если клиент управляет собственным менеджером пула (например, если он создан с пользовательскими параметрами TLS/прокси). Для общего пула по умолчанию используйте client.close_connections(), чтобы принудительно очистить сокеты; в противном случае соединения будут автоматически освобождены по истечении периода бездействия и при завершении процесса.
client = clickhouse_connect.get_client(
host="my-host",
username="default",
password="password",
)
try:
result = client.query("SELECT 1")
finally:
client.close()Или используйте контекстный менеджер:
with clickhouse_connect.get_client(
host="my-host",
username="default",
password="password",
) as client:
result = client.query("SELECT 1")Когда использовать несколько клиентов
Несколько клиентов уместны в следующих случаях:
- Разные серверы: один клиент на каждый сервер 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 и строковым значением
import datetime
my_date = datetime.datetime(2022, 10, 1, 15, 20, 5)
parameters = {
"table": "my_table",
"v1": my_date,
"v2": "a string with a single quote'",
}
client.query(
"SELECT * FROM {table:Identifier} "
"WHERE date >= {v1:DateTime} AND string ILIKE {v2:String}",
parameters=parameters,
)Это эквивалентно:
SELECT *
FROM my_table
WHERE date >= '2022-10-01 15:20:05'
AND string ILIKE 'a string with a single quote\''Привязка на стороне клиента
ClickHouse Connect также поддерживает привязку параметров на стороне клиента, что дает больше гибкости при формировании шаблонизированных SQL-запросов. Для привязки на стороне клиента аргумент parameters должен быть словарём или последовательностью. При привязке на стороне клиента для подстановки параметров используется форматирование строк Python в стиле "printf".
Обратите внимание: в отличие от привязки на стороне сервера, привязка на стороне клиента не работает с идентификаторами баз данных, таблиц и столбцов, поскольку форматирование в стиле Python не различает разные типы строк, а для них требуется разное оформление (обратные кавычки или двойные кавычки для идентификаторов базы данных и одинарные кавычки для значений данных).
- Пример с Python-словарём, значением DateTime и экранированием строк
import datetime
my_date = datetime.datetime(2022, 10, 1, 15, 20, 5)
parameters = {"v1": my_date, "v2": "a string with a single quote'"}
client.query(
"SELECT * FROM my_table "
"WHERE date >= %(v1)s AND string ILIKE %(v2)s",
parameters=parameters,
)В результате на сервере формируется следующий запрос:
SELECT *
FROM my_table
WHERE date >= '2022-10-01 15:20:05'
AND string ILIKE 'a string with a single quote\''- Пример с последовательностью Python Sequence (Tuple), Float64 и IPv4Address
import ipaddress
parameters = (35200.44, ipaddress.IPv4Address(0x443d04fe))
client.query(
"SELECT * FROM some_table WHERE metric >= %s AND ip_address = %s",
parameters=parameters,
)В результате на сервере формируется следующий запрос:
SELECT *
FROM some_table
WHERE metric >= 35200.44
AND ip_address = '68.61.4.254'аргумент settings
Все основные методы клиента ClickHouse Connect — "insert" и "select" — принимают необязательный именованный аргумент settings, который позволяет передавать пользовательские настройки сервера ClickHouse для данного SQL-оператора. Аргумент settings должен быть словарём. Каждый элемент должен содержать имя настройки ClickHouse и соответствующее ей значение. Обратите внимание, что при отправке на сервер в качестве параметров запроса значения будут преобразованы в строки.
Как и в случае с настройками на уровне клиента, ClickHouse Connect отбрасывает любые настройки, которые сервер помечает как readonly=1, с соответствующим сообщением в журнале. Настройки, применимые только к запросам через HTTP-интерфейс ClickHouse, всегда допустимы. Эти настройки описаны в API get_client.
Пример использования настроек ClickHouse:
settings = {
"merge_tree_min_rows_for_concurrent_read": 65535,
"session_id": "session_1234",
"use_skip_indexes": False,
}
client.query(
"SELECT event_type, sum(timeout) "
"FROM event_errors WHERE event_time > '2022-08-01'",
settings=settings,
)Метод command клиента
Используйте Client.command для операторов, которые не возвращают табличный набор данных, или для запросов, которые возвращают одно примитивное значение или одну строку. В зависимости от ответа метод возвращает строку, целое число, последовательность строк или QuerySummary. Если чтение даёт пустой результирующий набор, возвращается пустая строка.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
| cmd | str | Required | Оператор ClickHouse SQL, который возвращает одно значение или одну строку значений. |
| parameters | dict or sequence | None | См. описание параметра parameters. |
| data | str or bytes | None | Необязательные данные, включаемые в команду как тело POST-запроса. |
| settings | dict | None | См. описание параметра settings. |
| use_database | bool | True | Использовать базу данных клиента (указанную при создании клиента). False означает, что команда будет использовать базу данных сервера ClickHouse по умолчанию для подключенного пользователя. |
| external_data | ExternalData | None | Объект ExternalData, содержащий файловые или бинарные данные для использования с запросом. См. Advanced Queries (External Data) |
| transport_settings | dict | None | Необязательный словарь HTTP-заголовков, который включается в этот запрос. Каждая пара ключ-значение добавляется как HTTP-заголовок (например, {'X-Custom-Header': 'value'}). Полезно для аутентификации через прокси, трассировки запросов или передачи заголовков, требуемых промежуточной инфраструктурой. |
Примеры команд
DDL-операторы
import clickhouse_connect
client = clickhouse_connect.get_client()
# Create a table. A successful DDL returns QuerySummary.
summary = client.command(
"CREATE TABLE test_command "
"(col_1 String, col_2 DateTime) "
"ENGINE MergeTree ORDER BY tuple()"
)
print(summary.query_id())
# Show table definition
result = client.command("SHOW CREATE TABLE test_command")
print(result)
# Output:
# CREATE TABLE default.test_command
# (
# `col_1` String,
# `col_2` DateTime
# )
# ENGINE = MergeTree
# ORDER BY tuple()
# Drop table
client.command("DROP TABLE test_command")Простые запросы, возвращающие одиночные значения
import clickhouse_connect
client = clickhouse_connect.get_client()
# Single value result
count = client.command("SELECT count() FROM system.tables")
print(count)
# Server version
version = client.command("SELECT version()")
print(version)Команды с параметрами
import clickhouse_connect
client = clickhouse_connect.get_client()
# Использование параметров на стороне клиента
table_name = "system"
result = client.command(
"SELECT count() FROM system.tables WHERE database = %(db)s",
parameters={"db": table_name}
)
# Использование параметров на стороне сервера
result = client.command(
"SELECT count() FROM system.tables WHERE database = {db:String}",
parameters={"db": "system"}
)Команды с настройками
import clickhouse_connect
client = clickhouse_connect.get_client()
# Выполнение команды с определёнными настройками
result = client.command(
"OPTIMIZE TABLE large_table FINAL",
settings={"optimize_throw_if_noop": 1}
)Метод query клиента Client
Client.query получает табличный набор данных в Native format ClickHouse и возвращает QueryResult. Полный результат материализуется при обращении к его свойству. Для результатов, которые не следует хранить в памяти, используйте стриминговый метод.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
query |
str | Required | запрос к ClickHouse, который возвращает табличный результат, чаще всего SELECT или DESCRIBE. Может быть опущен, если передан через context. |
parameters |
dict or sequence | None |
См. аргумент Parameters. |
settings |
dict | None |
См. аргумент Settings. |
query_formats |
dict | None |
Формат чтения по типу ClickHouse. См. Форматы чтения. |
column_formats |
dict | None |
Формат чтения по столбцу результата, включая сопоставления форматов для типа Nested. |
encoding |
str | None |
Кодирование столбцов String. По умолчанию используется UTF-8. |
use_none |
bool | True |
Возвращает None для SQL NULL. Если указано false, возвращает значение NULL этого типа по умолчанию. Методы NumPy/Pandas выбирают значения по умолчанию с приоритетом производительности. |
column_oriented |
bool | False |
Возвращает результат в виде столбцов, а не строк. |
use_numpy |
bool | False |
Считывает совместимые столбцы результата в массивы NumPy внутри QueryResult. Если нужен результат в виде одной матрицы NumPy, предпочтительно использовать query_np. |
max_str_len |
int | 0 |
При use_numpy использует Unicode dtype фиксированной ширины для столбцов String длиной до этого значения. Ноль использует массивы объектов. |
context |
QueryContext |
None |
Контекст запроса для повторного использования. Явно заданные аргументы метода переопределяют значения контекста. |
query_tz |
str or tzinfo |
None |
Часовой пояс, применяемый ко всем столбцам результата DateTime и DateTime64. |
column_tzs |
dict | None |
Сопоставление часовых поясов для отдельных столбцов. |
external_data |
ExternalData |
None |
Внешний файл или бинарные данные. См. Внешние данные. |
transport_settings |
dict | None |
HTTP-заголовки, добавляемые к этому запросу. |
tz_mode |
str | Client default | Переопределение обработки часовых поясов для отдельного запроса: "naive_utc", "aware" или "schema". |
Примеры запросов
Простой запрос
import clickhouse_connect
client = clickhouse_connect.get_client()
# Simple SELECT query
result = client.query(
"SELECT number, toString(number) AS label FROM numbers(3)"
)
# Access results as rows
for row in result.result_rows:
print(row)
# Output:
# (0, '0')
# (1, '1')
# (2, '2')
# Access column names and types
print(result.column_names)
# Output: ('number', 'label')
print([col_type.name for col_type in result.column_types])
# Output: ['UInt64', 'String']Доступ к результатам запроса
import clickhouse_connect
client = clickhouse_connect.get_client()
result = client.query("SELECT number, toString(number) AS str FROM system.numbers LIMIT 3")
# Row-oriented access (default)
print(result.result_rows)
# Output: [(0, '0'), (1, '1'), (2, '2')]
# Column-oriented access
print(result.result_columns)
# Output: [[0, 1, 2], ['0', '1', '2']]
# Named results (list of dictionaries)
for row_dict in result.named_results():
print(row_dict)
# Output:
# {'number': 0, 'str': '0'}
# {'number': 1, 'str': '1'}
# {'number': 2, 'str': '2'}
# First row as dictionary
print(result.first_item)
# Output: {'number': 0, 'str': '0'}
# First row as tuple
print(result.first_row)
# Output: (0, '0')Запрос с параметрами на стороне клиента
import clickhouse_connect
client = clickhouse_connect.get_client()
# Использование параметров словаря (в стиле printf)
query = "SELECT * FROM system.tables WHERE database = %(db)s AND name LIKE %(pattern)s"
parameters = {"db": "system", "pattern": "%query%"}
result = client.query(query, parameters=parameters)
# Использование параметров кортежа
query = "SELECT * FROM system.tables WHERE database = %s LIMIT %s"
parameters = ("system", 5)
result = client.query(query, parameters=parameters)Запрос с параметрами на стороне сервера
import clickhouse_connect
client = clickhouse_connect.get_client()
# Привязка на стороне сервера (более безопасна, обеспечивает лучшую производительность для SELECT-запросов)
query = "SELECT * FROM system.tables WHERE database = {db:String} AND name = {tbl:String}"
parameters = {"db": "system", "tbl": "query_log"}
result = client.query(query, parameters=parameters)Запрос с настройками
import clickhouse_connect
client = clickhouse_connect.get_client()
# Передать настройки ClickHouse вместе с запросом
result = client.query(
"SELECT sum(number) FROM numbers(1000000)",
settings={
"max_block_size": 100000,
"max_execution_time": 30
}
)Объект 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– Внутренние контексты потоков. Вместо них используйте соответствующие стриминговые методы клиента.
См. Стриминговые запросы, чтобы узнать о поддерживаемых API StreamContext.
Получение результатов запросов с помощью NumPy, Pandas или Arrow
ClickHouse Connect предоставляет специализированные методы запросов для форматов данных NumPy, Pandas и Arrow. Подробную информацию об использовании этих методов, включая примеры, возможности стриминга и расширенную обработку типов, см. в разделе Расширенное выполнение запросов (запросы NumPy, Pandas и Arrow).
Методы потокового выполнения запросов в клиенте
Для потоковой передачи больших результирующих наборов ClickHouse Connect предоставляет несколько методов. Подробности и примеры см. в разделе Расширенные запросы (потоковые запросы).
Метод клиента insert
Для типичного сценария вставки нескольких записей в ClickHouse предусмотрен метод Client.insert. Он принимает следующие параметры:
| Parameter | Type | Default | Description |
|---|---|---|---|
table |
str | Обязательно | Целевая таблица. Допускается имя с указанием базы данных. Может быть опущено, если задана через context. |
data |
Sequence of Sequences | Обязательно | Матрица данных в строковом или столбцовом формате. Может быть передана позже через InsertContext. |
column_names |
str or Sequence[str] | "*" |
Упорядоченные столбцы. "*" запускает запрос метаданных для определения всех столбцов, в которые можно выполнять вставку. |
database |
str or None | База данных клиента | Целевая база данных, если table указана без базы данных. |
column_types |
Sequence[ClickHouseType] |
None |
Явно заданные типы столбцов. При указании позволяет избежать запроса метаданных. |
column_type_names |
Sequence[str] | None |
Явно заданные имена типов ClickHouse. Альтернатива column_types. |
column_oriented |
bool | False |
Интерпретировать data как столбцы, а не как строки. |
settings |
dict | None |
См. аргумент Settings. |
context |
InsertContext |
None |
Повторно используемый контекст вставки. См. InsertContexts. |
transport_settings |
dict | None |
HTTP-заголовки, добавляемые к этому запросу. |
Этот метод возвращает QuerySummary. Его словарь summary содержит значения, сообщаемые сервером. written_rows — это удобное свойство, а written_bytes() и query_id() возвращают соответствующие значения. При ошибке вставки будет вызвано исключение.
Описание специализированных методов вставки, работающих с Pandas DataFrames, PyArrow Tables и DataFrames на базе Arrow, см. в разделе Расширенная вставка (Специализированные методы вставки).
Примеры
В примерах ниже предполагается наличие таблицы users со схемой (id UInt32, name String, age UInt8).
Базовая построчная вставка
import clickhouse_connect
client = clickhouse_connect.get_client()
# Row-oriented data: each inner list is a row
data = [
[13, "user_1", 25],
[79, "user_2", 30],
]
client.insert("users", data, column_names=["id", "name", "age"])Вставка в столбцовом формате
import clickhouse_connect
client = clickhouse_connect.get_client()
# Column-oriented data: each inner list is a column
data = [
[13, 79], # id column
["user_1", "user_2"], # name column
[25, 30], # age column
]
client.insert("users", data, column_names=["id", "name", "age"], column_oriented=True)Вставка с явным указанием типов столбцов
import clickhouse_connect
client = clickhouse_connect.get_client()
# Useful when you want to avoid a DESCRIBE query to the server
data = [
[13, "user_1", 25],
[79, "user_2", 30],
]
client.insert(
"users",
data,
column_names=["id", "name", "age"],
column_type_names=["UInt32", "String", "UInt8"],
)Вставка в определённую базу данных
import clickhouse_connect
client = clickhouse_connect.get_client()
data = [
[13, "user_1", 25],
[79, "user_2", 30],
]
# Insert into a table in a specific database
client.insert(
"users",
data,
column_names=["id", "name", "age"],
database="production",
)Вставка из файлов
Чтобы напрямую вставлять данные из файлов в таблицы 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.
from clickhouse_connect import dbapi
connection = dbapi.connect(
host="localhost",
username="default",
password="password",
database="default",
)
cursor = connection.cursor()
try:
cursor.execute(
"SELECT name FROM system.tables "
"WHERE database = %(database)s ORDER BY name LIMIT 5",
{"database": "system"},
)
print(cursor.description)
print(cursor.fetchall())
finally:
cursor.close()
connection.close()Cursor.execute и Cursor.executemany принимают дополнительные именованные аргументы settings и query_formats. settings передаёт настройки ClickHouse. query_formats применяет форматы чтения по типам ClickHouse, когда оператор возвращает строки, используя то же сопоставление, что и Client.query. Cursor.execute также принимает доступный только по имени аргумент pyformat_encoded. Его значение по умолчанию True соответствует контракту DB-API pyformat. Диалект SQLAlchemy устанавливает его в False, когда компилятор оператора генерирует необработанные знаки процента, поэтому приложениям обычно не следует задавать его. 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__.
Исключения
Пользовательские исключения, включая иерархию исключений DB-API 2.0, определены в 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.
Многопоточные, многопроцессные и асинхронные/событийно-ориентированные сценарии использования
Подробнее об использовании ClickHouse Connect в многопоточных, многопроцессных и асинхронных/событийно-ориентированных приложениях см. в разделе Расширенное использование (многопоточные, многопроцессные и асинхронные/событийно-ориентированные сценарии использования).
AsyncClient
Сведения о непосредственном использовании AsyncClient с asyncio см. в разделе Расширенное использование (AsyncClient).
Управление идентификаторами сеансов ClickHouse
Сведения об управлении идентификаторами сеансов ClickHouse в многопоточных или параллельно работающих приложениях см. в разделе Расширенное использование (Управление идентификаторами сеансов ClickHouse).
Настройка пула HTTP-соединений
Сведения о настройке пула HTTP-соединений для крупных многопоточных приложений см. в разделе Расширенное использование (настройка пула HTTP-соединений).