Вставка данных с помощью ClickHouse Connect: расширенные возможности
InsertContexts
insert и insert_df, в рамках InsertContext. Методы insert_arrow, insert_df_arrow и raw_insert отправляют свои полезные нагрузки напрямую и не используют его. InsertContext включает все значения, переданные в качестве аргументов в метод клиента insert. Кроме того, при первоначальном создании InsertContext ClickHouse Connect получает типы данных для столбцов, в которые выполняется вставка, что необходимо для эффективной вставки в Native format. При повторном использовании InsertContext для нескольких вставок этот “предварительный запрос” не выполняется, и вставки выполняются быстрее и эффективнее.
InsertContext можно получить с помощью метода клиента create_insert_context. Этот метод принимает те же аргументы, что и функция insert, за исключением самого context. Обратите внимание, что при повторном использовании следует изменять только свойство data у InsertContext. Это соответствует его назначению — предоставлять объект для многократной вставки новых данных в одну и ту же таблицу.
InsertContexts содержат изменяемое состояние, которое обновляется в процессе вставки, поэтому они не являются потокобезопасными.
Форматы записи
DateTime — целое число, клиент трактует его как секунду эпохи.
Обычно переопределять формат записи не требуется, но методы из clickhouse_connect.datatypes.format позволяют задать его глобально. Обёртки-контейнеры, такие как Array, Nullable и LowCardinality, сохраняют поведение форматирования типа элемента.
Параметры форматов записи
Специализированные методы вставки
insert_df— Вставка Pandas DataFrame как Native-данных, ориентированных по столбцам. Также поддерживаются явные имена/типы столбцов или повторно используемыйInsertContext.insert_arrow— Вставка таблицы PyArrow с использованием входного формата Arrow ClickHouse.insert_df_arrow— Вставка Pandas DataFrame на базе Arrow или Polars DataFrame. Все столбцы Pandas должны использовать dtype на базе Arrow.
database, settings и HTTP transport_settings для каждого request.
Массив NumPy является допустимым Sequence of Sequences и может использоваться как аргумент
data для основного метода insert, поэтому отдельный специализированный метод не требуется.Вставка из Pandas DataFrame
Вставка таблицы PyArrow
Вставка DataFrame на базе Arrow (pandas 2.x)
Создать таблицу по схеме PyArrow
create_table_from_arrow_schema формирует оператор CREATE TABLE на основе распространённых скалярных полей Arrow. Сопоставление охватывает знаковые и беззнаковые целые числа, числа с плавающей запятой, булевы значения, строки, даты и временные метки. Функция намеренно создаёт в ClickHouse столбцы, не допускающие NULL, и вызывает TypeError для неподдерживаемых типов Arrow, поэтому перед выполнением проверьте сгенерированный DDL.
Часовые пояса
datetime в столбцы DateTime или DateTime64 ClickHouse Connect преобразует их в значения Unix-времени.
Объекты datetime с часовым поясом
ClickHouse Connect использует модуль
zoneinfo из стандартной библиотеки. Драйвер больше не зависит от pytz.Объекты datetime без указания часового пояса
naive_datetime_insert управляет вставкой нативных объектов Python со значениями datetime без указания часового пояса. Она также применяется к строкам ISO без указания часового пояса, принимаемым столбцами DateTime64.
"local"— значение по умолчанию в версии 1.x. При вызове.timestamp()Python интерпретирует значение в часовом поясе процесса. Это сохраняет существующее поведение."server"интерпретирует значение как местное время в часовом поясе, заданном для столбцаDateTimeилиDateTime64. Если для столбца часовой пояс не задан, используется часовой пояс сервера, определённый при подключении клиента.
datetime или строки ISO для DateTime64, поэтому изменение применяется к существующим клиентам и повторно используемым контекстам вставки.
"server" ClickHouse Connect присоединяет целевой tzinfo перед преобразованием значения в эпоху. Для часовых поясов IANA применяются правила стандартной библиотеки для переходов на летнее время. При осеннем перекрытии используется значение fold объекта datetime. Значение по умолчанию fold=0 выбирает смещение до перехода, а fold=1 — после него. При весеннем пропуске применяется тот же выбор смещения; такое время не отклоняется и не нормализуется.
Несуществующие значения местного времени в весеннем пропуске могут не сохраняться при преобразовании туда и обратно через параметр запроса в режиме местного времени, поскольку текстовый парсер ClickHouse может выбрать другое смещение. Если важен конкретный момент времени, используйте datetime с часовым поясом или допустимое местное время.
Этот параметр применяется только к нативной вставке объектов Python datetime и наивных строк ISO, принимаемых DateTime64. Наивные столбцы NumPy и Pandas с dtype datetime64 сохраняют текущее преобразование местного времени UTC.
Чтобы представить конкретный момент времени независимо от режима, присоедините требуемый часовой пояс или явно укажите целое число эпохи.
datetime без часового пояса используется отдельная настройка naive_datetime_binding. В режиме "wall", используемом по умолчанию, поля времени передаются без преобразования в локальное время хоста. См. раздел аргумент Parameters.
Столбцы DateTime с метаданными часового пояса
DateTime('America/Denver') или DateTime64(3, 'Asia/Tokyo'). Эти метаданные определяют, как значения отображаются при выполнении запроса.
При вставке значения с часовым поясом ClickHouse Connect сохраняет соответствующий момент времени. Для значения без указания часового пояса параметр naive_datetime_insert определяет, используется ли часовой пояс процесса или часовой пояс столбца. При запросе результат использует часовой пояс столбца, если только для него не задано переопределение через аргумент column_tzs. Аргумент query_tz не переопределяет часовой пояс, объявленный для столбца.
Вставка из файлов
clickhouse_connect.driver.tools.insert_file потоково загружает локальный файл в существующую таблицу и передает разбор ClickHouse.
Настройки входного формата, такие как
input_format_allow_errors_ratio и input_format_allow_errors_num, можно передавать через settings.
AsyncClient вызовите insert_file_async с await, передав те же аргументы:
raw_insert, поэтому содержимое файла целиком загружается в память.