Вставка данных с помощью ClickHouse Connect: расширенные возможности
InsertContexts
InsertContext. InsertContext включает все значения, переданные в качестве аргументов в метод клиента insert. Кроме того, при первоначальном создании InsertContext ClickHouse Connect получает типы данных для столбцов, в которые выполняется вставка, что необходимо для эффективной вставки в Native format. При повторном использовании InsertContext для нескольких вставок этот “предварительный запрос” не выполняется, и вставки выполняются быстрее и эффективнее.
InsertContext можно получить с помощью метода клиента create_insert_context. Этот метод принимает те же аргументы, что и функция insert. Обратите внимание, что при повторном использовании следует изменять только свойство data у InsertContext. Это соответствует его назначению — предоставлять объект для многократной вставки новых данных в одну и ту же таблицу.
InsertContexts содержат изменяемое состояние, которое обновляется в процессе вставки, поэтому они не являются потокобезопасными.
Форматы записи
null). Например, при вставке в столбец DateTime, если первое вставляемое значение — целое число Python, ClickHouse Connect напрямую вставит это целое значение, предполагая, что оно представляет собой секунды epoch.
В большинстве случаев переопределять формат записи для типа данных не требуется, однако для этого на глобальном уровне можно использовать соответствующие методы из пакета clickhouse_connect.datatypes.format.
Параметры формата записи
| Тип ClickHouse | Нативный тип Python | Форматы записи | Комментарии |
|---|---|---|---|
| Int[8-64], UInt[8-32] | int | - | |
| UInt64 | int | ||
| [U]Int[128,256] | int | ||
| BFloat16 | float | ||
| Float32 | float | ||
| Float64 | float | ||
| Decimal | decimal.Decimal | ||
| String | string | ||
| FixedString | bytes | string | Если выполнять вставку как строки, дополнительные байты будут заполнены нулями |
| Enum[8,16] | string | ||
| Date | datetime.date | int | ClickHouse хранит значения Date как количество дней с 01/01/1970. Предполагается, что типы int содержат это значение “epoch date” |
| Date32 | datetime.date | int | То же, что и Date, но для более широкого диапазона дат |
| DateTime | datetime.datetime | int | ClickHouse хранит DateTime как количество секунд с начала эпохи Unix. Предполагается, что типы int содержат это значение “epoch second” |
| DateTime64 | datetime.datetime | int | datetime.datetime в Python ограничен точностью до микросекунд. Доступно исходное 64-битное значение int |
| Time | datetime.timedelta | int, string, time | ClickHouse хранит DateTime как количество секунд с начала эпохи Unix. Предполагается, что типы int содержат это значение “epoch second” |
| Time64 | datetime.timedelta | int, string, time | datetime.timedelta в Python ограничен точностью до микросекунд. Доступно исходное 64-битное значение int |
| IPv4 | ipaddress.IPv4Address | string | Строки в корректном формате можно вставлять как IPv4-адреса |
| IPv6 | ipaddress.IPv6Address | string | Строки в корректном формате можно вставлять как IPv6-адреса |
| Tuple | dict or tuple | ||
| Map | dict | ||
| Nested | Sequence[dict] | ||
| UUID | uuid.UUID | string | Строки в корректном формате можно вставлять как UUID ClickHouse |
| JSON/Object(‘json’) | dict | string | В JSON-столбцы можно вставлять как словари, так и JSON-строки (обратите внимание: Object('json') устарел) |
| Variant | object | В настоящее время все значения Variant вставляются как Strings и разбираются сервером ClickHouse | |
| Dynamic | object | Предупреждение — в настоящее время любые вставки в столбец типа Dynamic сохраняются как ClickHouse String |
Специализированные методы вставки
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)
Часовые пояса
datetime.datetime в столбцы ClickHouse DateTime или DateTime64 ClickHouse Connect автоматически обрабатывает информацию о часовом поясе. Поскольку ClickHouse хранит все значения DateTime как Unix-временные метки без привязки к часовому поясу (секунды или доли секунды с начала эпохи), преобразование часового пояса при вставке автоматически выполняется на стороне клиента.
Объекты datetime с часовым поясом
datetime.datetime с часовым поясом, ClickHouse Connect автоматически вызовет .timestamp(), чтобы преобразовать его в Unix-временную метку, которая корректно учитывает смещение часового пояса. Это означает, что вы можете выполнять вставку объектов datetime из любого часового пояса, и они будут правильно сохраняться как эквивалентная временная метка UTC.
При использовании pytz необходимо вызывать метод
localize(), чтобы добавить информацию о часовом поясе к naive datetime. Если передать tzinfo= напрямую в конструктор datetime, будут использованы некорректные исторические смещения. Для UTC корректно работает tzinfo=pytz.UTC. Подробнее см. в документации pytz.Объекты datetime без часового пояса
datetime.datetime без часового пояса (без tzinfo), метод .timestamp() интерпретирует его как объект в локальном часовом поясе системы. Чтобы избежать неоднозначности, рекомендуется:
- Всегда использовать при вставке объекты datetime с часовым поясом, или
- Убедиться, что часовой пояс системы установлен на UTC, или
- Вручную преобразовывать значения во временные метки epoch перед вставкой
Столбцы DateTime с метаданными часового пояса
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 принимает следующие параметры:
| Parameter | Type | Default | Description |
|---|---|---|---|
| parameter | Type | По умолчанию | Описание |
| client | Client | Обязательно | driver.Client, используемый для выполнения вставки |
| table | str | Обязательно | Таблица ClickHouse, в которую выполняется вставка. Допускается полное имя таблицы (включая базу данных). |
| file_path | str | Обязательно | Путь файловой системы к файлу с данными |
| fmt | str | CSV, CSVWithNames | Входной формат ClickHouse для файла. Если column_names не указан, используется CSVWithNames |
| column_names | Sequence of str | None | Список имён столбцов в файле с данными. Не требуется для форматов, включающих имена столбцов |
| database | str | None | База данных таблицы. Игнорируется, если таблица указана с полным именем. Если не указано, для вставки будет использоваться база данных клиента |
| settings | dict | None | См. описание settings. |
| compression | str | None | Поддерживаемый тип сжатия ClickHouse (zstd, lz4, gzip), используемый для HTTP-заголовка Content-Encoding |
input_format_allow_errors_num и input_format_allow_errors_num).