Перейти к основному содержанию
Все примеры кода для API ClickHouse можно найти здесь. Параметры подключения см. в разделе Конфигурация. Сведения о поддерживаемых типах данных и сопоставлении типов Go см. в разделе Типы данных.

Подключение

Следующий пример возвращает версию сервера и показывает, как подключиться к ClickHouse, предполагая, что ClickHouse не защищён и доступен для пользователя default. Обратите внимание, что для подключения используется стандартный порт native.
Полный пример Во всех последующих примерах, если не указано иное, предполагается, что переменная ClickHouse conn уже создана и доступна.

Выполнение

Произвольные команды можно выполнять с помощью метода Exec. Это полезно для DDL и простых операторов. Его не следует использовать для крупных вставок или перебора результатов запросов.
Полный пример Обратите внимание, что в запрос можно передать Context. Это позволяет задавать определённые настройки на уровне запроса — см. Использование контекста.

Вставка батчами

Чтобы выполнить вставку большого числа строк, клиент поддерживает батчи. Для этого нужно подготовить батч, в который можно добавлять строки. Затем он отправляется с помощью метода Send(). До вызова Send батчи хранятся в памяти. Рекомендуется вызывать Close для батча, чтобы избежать утечки соединений. Это можно сделать с помощью ключевого слова defer сразу после подготовки батча. Это освободит соединение, если Send так и не будет вызван. Обратите внимание: если строки не добавлялись, в журнале запросов в этом случае будет отображаться 0 вставленных строк.
Полный пример Рекомендации по ClickHouse приведены здесь. Батчи не следует использовать совместно в разных горутинах — создавайте отдельный батч для каждой горутины. В приведённом выше примере обратите внимание: при добавлении строк типы переменных должны соответствовать типу столбца. Хотя это соответствие обычно очевидно, данный интерфейс старается быть гибким, и типы будут преобразованы, если это не приведёт к потере точности. Например, ниже показано, как вставить строку в datetime64.
Полный пример Полный список поддерживаемых типов Go для каждого типа столбца см. в разделе Преобразования типов.

Эфемерные столбцы

Эфемерные столбцы — это столбцы, доступные только для записи, которые существуют лишь во время вставки: они не сохраняются, и их нельзя выбрать в запросе. Они полезны для вычисления значений производных столбцов в момент вставки.
Полный пример

Запрос строк

Вы можете либо выполнить запрос для одной строки с помощью метода QueryRow, либо получить курсор для итерации по результирующему набору через Query. В первом случае метод принимает пункт назначения, в который будут сериализованы данные, а во втором для каждой строки нужно вызывать Scan.
Полный пример
Полный пример Обратите внимание: в обоих случаях нужно передать указатель на переменные, в которые будут записаны значения соответствующих столбцов. Их необходимо передавать в порядке, указанном в операторе SELECT — по умолчанию в случае SELECT *, как показано выше, используется порядок объявления столбцов. Как и при вставке, метод Scan требует, чтобы переменные-приёмники имели подходящий тип. При этом сохраняется гибкость: где возможно, типы преобразуются, если это не приводит к потере точности; например, в примере выше столбец UUID считывается в строковую переменную. Полный список поддерживаемых типов Go для каждого типа столбца см. в разделе Преобразования типов. Наконец, обратите внимание, что в методы Query и QueryRow можно передавать Context. Это можно использовать для настроек на уровне запроса — подробнее см. в разделе Использование контекста.

Асинхронная вставка

Асинхронные вставки поддерживаются через метод Async. Это позволяет указать, должен ли клиент ждать, пока сервер завершит вставку, или возвращать ответ сразу после получения данных. Фактически это управляет параметром wait_for_async_insert.
Полный пример

Столбцовая вставка

Вставку можно выполнять в столбцовом формате. Это может повысить производительность, если данные уже организованы таким образом, поскольку их не нужно преобразовывать в строки.
Полный пример

Использование структур

Для пользователя структуры Golang служат логическим представлением строки данных в ClickHouse. Для работы с ними нативный интерфейс предоставляет несколько удобных функций.

Select с сериализацией

Метод Select позволяет за один вызов преобразовать набор строк ответа в срез структур.
Полный пример

Сканирование в структуру

ScanStruct позволяет записать одну строку результата запроса в структуру.
Полный пример

Добавление структуры

AppendStruct позволяет добавить структуру в существующий батч и интерпретировать её как полную строку. Для этого необходимо, чтобы столбцы структуры соответствовали таблице и по имени, и по типу. Хотя для каждого столбца должно быть эквивалентное поле структуры, некоторые поля структуры могут не иметь соответствующего представления в столбцах. Они будут просто проигнорированы.
Полный пример

Привязка параметров

Клиент поддерживает привязку параметров в методах Exec, Query и QueryRow. Как показано в примере ниже, поддерживаются именованные, нумерованные и позиционные параметры. Ниже приведены соответствующие примеры.
Полный пример

Особые случаи

По умолчанию срезы, переданные в запрос как параметр, разворачиваются в список значений, разделённых запятыми. Если требуется подставить набор значений в обрамлении [ ], следует использовать ArraySet. Если требуются группы/кортежи в обрамлении ( ), например для использования с операторами IN, можно использовать GroupSet. Это особенно полезно, когда требуется несколько групп, как показано в примере ниже. Наконец, для полей DateTime64 необходимо указывать precision, чтобы параметры отображались корректно. Однако уровень precision для поля клиенту неизвестен, поэтому пользователь должен указать его самостоятельно. Для этого предусмотрен параметр DateNamed.
Полный пример

Использование контекста

Контексты Go позволяют передавать дедлайны, сигналы отмены и другие значения уровня запроса через границы API. Все методы соединения принимают контекст в качестве первого аргумента. Хотя в предыдущих примерах использовался context.Background(), эту возможность можно использовать для передачи настроек и дедлайнов, а также для отмены запросов. Передача контекста, созданного с помощью withDeadline, позволяет задавать ограничения на время выполнения запросов. Обратите внимание: это абсолютное время, и по истечении срока будет только освобождено соединение и отправлен сигнал отмены в ClickHouse. В качестве альтернативы для явной отмены запроса можно использовать WithCancel. Вспомогательные функции clickhouse.WithQueryID и clickhouse.WithQuotaKey позволяют указать Query id и ключ квоты. Query id может быть полезен для отслеживания запросов в журналах и для их отмены. Ключ квоты можно использовать, чтобы накладывать ограничения на использование ClickHouse на основе уникального значения ключа — подробнее см. в разделе Управление квотами. Контекст также можно использовать, чтобы настройка применялась только к конкретному запросу, а не ко всему соединению, как показано в разделе Настройки соединения. Наконец, размер буфера block можно задать с помощью clickhouse.WithBlockSize. Это переопределяет настройку уровня соединения BlockBufferSize и задает максимальное число blocks, которые декодируются и одновременно хранятся в памяти. Более высокие значения потенциально дают больше параллелизма, но ценой большего потребления памяти. Примеры всего перечисленного приведены ниже.
Полный пример

Информация о Прогрессе, профиле и Log

Для запросов можно запрашивать информацию о Прогрессе, профиле и Log. Информация о Прогрессе содержит статистику о количестве строк и байтов, которые были прочитаны и обработаны в ClickHouse. В отличие от этого, информация профиля предоставляет сводку по данным, возвращённым клиенту, включая общее количество байтов (в несжатом виде), строк и блоков. Наконец, информация Log предоставляет статистику по потокам, например использование памяти и скорость обработки данных. Для получения этой информации пользователь должен использовать Context, в который можно передавать функции обратного вызова.
Полный пример

Динамическое сканирование

Может потребоваться читать таблицы, для которых заранее неизвестны схема или типы возвращаемых полей. Это часто встречается при эпизодическом анализе данных или при разработке универсальных инструментов. Для этого в ответах на запросы доступна информация о типах столбцов. Её можно использовать вместе с рефлексией Go, чтобы во время выполнения создавать экземпляры переменных с корректными типами, которые можно передать в Scan.
Полный пример

Внешние таблицы

Внешние таблицы позволяют клиенту отправлять данные в ClickHouse вместе с запросом SELECT. Эти данные помещаются во временную таблицу и могут использоваться в самом запросе для вычислений. Чтобы отправить внешние данные вместе с запросом, пользователь должен создать внешнюю таблицу через ext.NewTable, а затем передать её через объект контекста.
Полный пример

OpenTelemetry

ClickHouse поддерживает распространение контекста трассировки как по TCP, так и по HTTP. При использовании TCP клиент сериализует спан в собственный бинарный протокол. Используйте clickhouse.WithSpan, чтобы привязать спан к запросу через контекст.
Ограничение HTTP-транспортаХотя сервер ClickHouse принимает стандартные HTTP-заголовки traceparent / tracestate, HTTP-транспорт clickhouse-go сейчас их не отправляет — WithSpan не работает через HTTP. В качестве обходного решения можно задать заголовки вручную через HttpHeaders в параметрах подключения.
Полный пример Подробные сведения об использовании трассировки см. в разделе Поддержка OpenTelemetry.
Последнее изменение 29 июня 2026 г.