Перейти к основному содержанию
Полные примеры кода для стандартного API можно найти здесь. Сведения о конфигурации подключения см. в разделе Configuration. Сведения о поддерживаемых типах данных и сопоставлении типов Go см. в разделе Data Types. API database/sql, или «стандартный» API, позволяет использовать клиент в сценариях, где прикладной код должен оставаться независимым от конкретной базы данных за счёт соответствия стандартному интерфейсу. Это имеет свою цену: дополнительные уровни абстракции и косвенности, а также примитивы, не всегда согласующиеся с ClickHouse. Однако такие издержки обычно приемлемы в сценариях, где инструментам нужно подключаться к нескольким базам данных. Кроме того, этот клиент поддерживает использование HTTP в качестве транспортного уровня — при этом данные по-прежнему кодируются в формате Native для оптимальной производительности.

Подключение

Подключиться можно либо с помощью строки DSN в формате clickhouse://<host>:<port>?<query_option>=<value> и метода Open, либо через метод clickhouse.OpenDB. Последний не входит в спецификацию database/sql, но возвращает экземпляр sql.DB. Этот метод предоставляет дополнительные возможности, например доступ к данным профилирования, для которых спецификация database/sql не предлагает очевидного способа предоставления.
Полный пример Во всех последующих примерах, если не указано иное, предполагается, что переменная ClickHouse conn уже создана и доступна.

Настройки подключения

Большинство параметров конфигурации являются общими с API ClickHouse. Общие настройки см. в разделе Конфигурация. Доступны следующие параметры DSN, специфичные для SQL:
  • hosts - разделённый запятыми список хостов с одним адресом для балансировки нагрузки и переключения при отказе — см. Подключение к нескольким узлам.
  • username/password - учётные данные для аутентификации — см. Аутентификация
  • database - выбрать текущую базу данных по умолчанию
  • dial_timeout - строка длительности представляет собой, возможно, знаковую последовательность десятичных чисел, каждое из которых может иметь дробную часть и суффикс единицы измерения, например 300ms, 1s. Допустимые единицы времени: ms, s, m.
  • connection_open_strategy - random/in_order (по умолчанию random) - см. Подключение к нескольким узлам
    • round_robin - выбрать сервер из набора по принципу round-robin
    • in_order - выбирается первый доступный сервер в указанном порядке
  • debug - включить вывод отладочной информации (логическое значение)
  • compress - указать алгоритм сжатия - none (по умолчанию), zstd, lz4, gzip, deflate, br. Если установлено значение true, будет использоваться lz4. Для native-протокола поддерживаются только lz4 и zstd.
  • compress_level - уровень сжатия (по умолчанию 0). См. раздел сжатие. Это зависит от алгоритма:
    • gzip - от -2 (максимальная скорость) до 9 (максимальное сжатие)
    • deflate - от -2 (максимальная скорость) до 9 (максимальное сжатие)
    • br - от 0 (максимальная скорость) до 11 (максимальное сжатие)
    • zstd, lz4 - игнорируется
  • secure - установить защищённое SSL-соединение (по умолчанию false)
  • skip_verify - пропустить проверку сертификата (по умолчанию false)
  • block_buffer_size - позволяет управлять размером буфера block. См. BlockBufferSize. (по умолчанию 2)
Полный пример

Подключение по HTTP

По умолчанию соединения устанавливаются по собственному протоколу. Если вам нужен HTTP, это можно включить: либо изменить DSN, добавив HTTP-протокол, либо указать Protocol в параметрах подключения.
Полный пример

Сеансы

Только HTTPСеансы нужны только при использовании HTTP-транспорта. В нативных TCP-соединениях сеанс уже встроен и создаётся автоматически.
При использовании HTTP передайте session_id в качестве настройки, чтобы включить возможности, завязанные на сеанс, например временные таблицы.
Полный пример

Выполнение

После получения соединения можно выполнять команды sql с помощью метода Exec.
Полный пример Этот метод не поддерживает передачу контекста — по умолчанию он выполняется с фоновым контекстом. При необходимости используйте ExecContext, см. Использование контекста.

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

Семантику батча можно реализовать, создав sql.Tx с помощью метода Being. Из него можно получить батч с помощью метода Prepare и оператора INSERT. В результате возвращается sql.Stmt, к которому можно добавлять строки с помощью метода Exec. Батч будет накапливаться в памяти, пока для исходного sql.Tx не будет выполнен Commit.
Полный пример

Запрос строк

Получить одну строку можно с помощью метода QueryRow. Он возвращает *sql.Row, для которого можно вызвать Scan, передав указатели на переменные, в которые будут записаны значения столбцов. Вариант QueryRowContext позволяет передать контекст, отличный от background — см. Использование контекста.
Полный пример Для перебора нескольких строк используется метод Query. Он возвращает структуру *sql.Rows, у которой можно вызывать Next для итерации по строкам. Эквивалент QueryContext позволяет передавать контекст.
Полный пример

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

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

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

Стандартный API поддерживает те же возможности привязки параметров, что и API ClickHouse: параметры можно передавать в методы Exec, Query и QueryRow (а также в их эквивалентные варианты с Context). Поддерживаются позиционные, именованные и нумерованные параметры.
Полный пример Обратите внимание: особые случаи по-прежнему действуют.

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

Стандартный API поддерживает ту же возможность передавать через контекст дедлайны, сигналы отмены и другие значения, относящиеся к конкретному запросу, что и API ClickHouse. В отличие от API ClickHouse, здесь это реализовано через варианты методов с Context: например, у методов вроде Exec, которые по умолчанию используют фоновый контекст, есть вариант ExecContext, в который контекст передаётся первым параметром. Это позволяет передавать контекст на любом этапе работы приложения. Например, вы можете передать контекст при установлении соединения через ConnContext или при запросе одной строки через QueryRowContext. Ниже приведены примеры всех доступных методов. Подробнее об использовании контекста для передачи дедлайнов, сигналов отмены, идентификаторов запросов, ключей квот и настроек соединения см. в разделе Использование контекста для API ClickHouse.
Полный пример

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

Как и в API ClickHouse, здесь доступна информация о типах столбцов, которая позволяет во время выполнения создавать экземпляры переменных с корректными типами и передавать их в Scan. Это позволяет считывать столбцы, даже если их тип заранее неизвестен.
Полный пример

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

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

OpenTelemetry

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

Сжатие

Стандартный API поддерживает те же алгоритмы сжатия, что и нативный API ClickHouse, а именно сжатие lz4 и zstd на уровне блоков. Кроме того, для HTTP-соединений поддерживается сжатие gzip, deflate и br. Если включен любой из этих вариантов, сжатие применяется к блокам при вставке и к ответам на запросы. Другие запросы, например Ping или запросы query, останутся несжатыми. Это соответствует параметрам lz4 и zstd. Если для установления соединения используется метод OpenDB, можно передать конфигурацию Compression. В ней также можно указать уровень сжатия (см. ниже). Если соединение устанавливается через sql.Open с DSN, используйте параметр compress. Это может быть либо конкретный алгоритм сжатия, то есть gzip, deflate, br, zstd или lz4, либо булев флаг. Если установлено значение true, будет использоваться lz4. По умолчанию используется none, то есть сжатие отключено.
Полный пример
Полный пример Уровень применяемого сжатия можно задавать через параметр DSN compress&#95;level или поле Level в опции Compression. По умолчанию используется 0, но конкретное значение зависит от алгоритма:
  • gzip - от -2 (максимальная скорость) до 9 (максимальное сжатие)
  • deflate - от -2 (максимальная скорость) до 9 (максимальное сжатие)
  • br - от 0 (максимальная скорость) до 11 (максимальное сжатие)
  • zstd, lz4 - игнорируется
Последнее изменение 2 июля 2026 г.