Перейти к основному содержанию

Вставка данных с помощью ClickHouse Connect: расширенные возможности

InsertContexts

ClickHouse Connect выполняет все вставки в рамках InsertContext. InsertContext включает все значения, переданные в качестве аргументов в метод клиента insert. Кроме того, при первоначальном создании InsertContext ClickHouse Connect получает типы данных для столбцов, в которые выполняется вставка, что необходимо для эффективной вставки в Native format. При повторном использовании InsertContext для нескольких вставок этот “предварительный запрос” не выполняется, и вставки выполняются быстрее и эффективнее. InsertContext можно получить с помощью метода клиента create_insert_context. Этот метод принимает те же аргументы, что и функция insert. Обратите внимание, что при повторном использовании следует изменять только свойство data у InsertContext. Это соответствует его назначению — предоставлять объект для многократной вставки новых данных в одну и ту же таблицу.
InsertContexts содержат изменяемое состояние, которое обновляется в процессе вставки, поэтому они не являются потокобезопасными.

Форматы записи

Форматы записи в настоящее время реализованы для ограниченного числа типов. В большинстве случаев ClickHouse Connect попытается автоматически определить подходящий формат записи для столбца, проверяя тип первого значения данных (не null). Например, при вставке в столбец DateTime, если первое вставляемое значение — целое число Python, ClickHouse Connect напрямую вставит это целое значение, предполагая, что оно представляет собой секунды epoch. В большинстве случаев переопределять формат записи для типа данных не требуется, однако для этого на глобальном уровне можно использовать соответствующие методы из пакета clickhouse_connect.datatypes.format.

Параметры формата записи

Специализированные методы вставки

ClickHouse Connect предоставляет специализированные методы вставки для распространённых форматов данных:
  • insert_df — Вставка Pandas DataFrame. Вместо Python-аргумента data типа Sequence of Sequences этот метод в качестве второго параметра принимает аргумент df, который должен быть экземпляром Pandas DataFrame. ClickHouse Connect автоматически обрабатывает DataFrame как ориентированный по столбцам источник данных, поэтому параметр column_oriented не требуется и недоступен.
  • insert_arrow — Вставка таблицы PyArrow. ClickHouse Connect передаёт таблицу Arrow на сервер ClickHouse без изменений для обработки, поэтому помимо table и arrow_table доступны только аргументы database и settings.
  • insert_df_arrow — Вставка Pandas DataFrame с backend’ом Arrow или Polars DataFrame. ClickHouse Connect автоматически определяет, относится ли DataFrame к типу Pandas или Polars. Если это Pandas, выполняется проверка того, что backend dtype каждого столбца основан на Arrow; если хотя бы для одного столбца это не так, будет сгенерирована ошибка.
Массив NumPy является допустимым Sequence of Sequences и может использоваться как аргумент data для основного метода insert, поэтому отдельный специализированный метод не требуется.

Вставка из Pandas DataFrame

Вставка таблицы PyArrow

Вставка DataFrame на базе Arrow (pandas 2.x)

Часовые пояса

При вставке объектов Python datetime.datetime в столбцы ClickHouse DateTime или DateTime64 ClickHouse Connect автоматически обрабатывает информацию о часовом поясе. Поскольку ClickHouse хранит все значения DateTime как Unix-временные метки без привязки к часовому поясу (секунды или доли секунды с начала эпохи), преобразование часового пояса при вставке автоматически выполняется на стороне клиента.

Объекты datetime с часовым поясом

Если вы выполняете вставку объекта Python datetime.datetime с часовым поясом, ClickHouse Connect автоматически вызовет .timestamp(), чтобы преобразовать его в Unix-временную метку, которая корректно учитывает смещение часового пояса. Это означает, что вы можете выполнять вставку объектов datetime из любого часового пояса, и они будут правильно сохраняться как эквивалентная временная метка UTC.
В этом примере все три объекта datetime представляют разные моменты времени, поскольку у них разные часовые пояса. Каждый из них будет корректно преобразован в соответствующую Unix-временную метку и сохранён в ClickHouse.
При использовании pytz необходимо вызывать метод localize(), чтобы добавить информацию о часовом поясе к naive datetime. Если передать tzinfo= напрямую в конструктор datetime, будут использованы некорректные исторические смещения. Для UTC корректно работает tzinfo=pytz.UTC. Подробнее см. в документации pytz.

Объекты datetime без часового пояса

Если вы выполняете вставку объекта Python datetime.datetime без часового пояса (без tzinfo), метод .timestamp() интерпретирует его как объект в локальном часовом поясе системы. Чтобы избежать неоднозначности, рекомендуется:
  1. Всегда использовать при вставке объекты datetime с часовым поясом, или
  2. Убедиться, что часовой пояс системы установлен на UTC, или
  3. Вручную преобразовывать значения во временные метки epoch перед вставкой

Столбцы DateTime с метаданными часового пояса

Столбцы ClickHouse можно определять с метаданными часового пояса (например, DateTime('America/Denver') или DateTime64(3, 'Asia/Tokyo')). Эти метаданные не влияют на способ хранения данных (они по-прежнему сохраняются как UTC-временные метки), но определяют часовой пояс, который используется при запросе данных из ClickHouse. При вставке в такие столбцы ClickHouse Connect преобразует ваш объект Python datetime в Unix-временную метку (с учётом его часового пояса, если он задан). Когда вы запрашиваете данные, ClickHouse Connect вернёт datetime, преобразованный в часовой пояс столбца, независимо от того, какой часовой пояс использовался при вставке.

Вставка из файлов

Пакет clickhouse_connect.driver.tools включает метод insert_file, который позволяет вставлять данные напрямую из файловой системы в существующую таблицу ClickHouse. Разбор данных выполняет ClickHouse server. insert_file принимает следующие параметры: Для файлов с несогласованными данными или значениями даты/времени в необычном формате этот метод поддерживает settings, применимые к импорту данных (например, input_format_allow_errors_num и input_format_allow_errors_num).
Последнее изменение 10 июня 2026 г.