database/sql, или «стандартный» API, позволяет использовать клиент в сценариях, где прикладной код должен оставаться независимым от конкретной базы данных за счёт соответствия стандартному интерфейсу. Это имеет свою цену: дополнительные уровни абстракции и косвенности, а также примитивы, не всегда согласующиеся с ClickHouse. Однако такие издержки обычно приемлемы в сценариях, где инструментам нужно подключаться к нескольким базам данных.
Кроме того, этот клиент поддерживает использование HTTP в качестве транспортного уровня — при этом данные по-прежнему кодируются в формате Native для оптимальной производительности.
Подключение
clickhouse://<host>:<port>?<query_option>=<value> и метода Open, либо через метод clickhouse.OpenDB. Последний не входит в спецификацию database/sql, но возвращает экземпляр sql.DB. Этот метод предоставляет дополнительные возможности, например доступ к данным профилирования, для которых спецификация database/sql не предлагает очевидного способа предоставления.
conn уже создана и доступна.
Настройки подключения
hosts- разделённый запятыми список хостов с одним адресом для балансировки нагрузки и переключения при отказе — см. Подключение к нескольким узлам.username/password- учётные данные для аутентификации — см. Аутентификацияdatabase- выбрать текущую базу данных по умолчаниюdial_timeout- строка длительности представляет собой, возможно, знаковую последовательность десятичных чисел, каждое из которых может иметь дробную часть и суффикс единицы измерения, например300ms,1s. Допустимые единицы времени:ms,s,m.connection_open_strategy-random/in_order(по умолчаниюrandom) - см. Подключение к нескольким узламround_robin- выбрать сервер из набора по принципу round-robinin_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
Protocol в параметрах подключения.
Сеансы
Только HTTPСеансы нужны только при использовании HTTP-транспорта. В нативных TCP-соединениях сеанс уже встроен и создаётся автоматически.
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.
Привязка параметров
Exec, Query и QueryRow (а также в их эквивалентные варианты с Context). Поддерживаются позиционные, именованные и нумерованные параметры.
Использование контекста
Context: например, у методов вроде Exec, которые по умолчанию используют фоновый контекст, есть вариант ExecContext, в который контекст передаётся первым параметром. Это позволяет передавать контекст на любом этапе работы приложения. Например, вы можете передать контекст при установлении соединения через ConnContext или при запросе одной строки через QueryRowContext. Ниже приведены примеры всех доступных методов.
Подробнее об использовании контекста для передачи дедлайнов, сигналов отмены, идентификаторов запросов, ключей квот и настроек соединения см. в разделе Использование контекста для API ClickHouse.
Динамическое сканирование
Внешние таблицы
SELECT. Эти данные помещаются во временную таблицу и могут использоваться в самом запросе при вычислениях.
Чтобы отправить внешние данные вместе с запросом, пользователь должен создать внешнюю таблицу с помощью ext.NewTable, а затем передать её через контекст.
OpenTelemetry
clickhouse.WithSpan, чтобы привязать спан к запросу через контекст.
Ограничение HTTP-транспортаХотя сервер ClickHouse принимает стандартные HTTP-заголовки
traceparent / tracestate, HTTP-транспорт clickhouse-go пока их не отправляет — WithSpan не работает при использовании HTTP. В качестве обходного пути можно задать эти заголовки вручную через HttpHeaders в параметрах подключения.Сжатие
lz4 и zstd на уровне блоков. Кроме того, для HTTP-соединений поддерживается сжатие gzip, deflate и br. Если включен любой из этих вариантов, сжатие применяется к блокам при вставке и к ответам на запросы. Другие запросы, например Ping или запросы query, останутся несжатыми. Это соответствует параметрам lz4 и zstd.
Если для установления соединения используется метод OpenDB, можно передать конфигурацию Compression. В ней также можно указать уровень сжатия (см. ниже). Если соединение устанавливается через sql.Open с DSN, используйте параметр compress. Это может быть либо конкретный алгоритм сжатия, то есть gzip, deflate, br, zstd или lz4, либо булев флаг. Если установлено значение true, будет использоваться lz4. По умолчанию используется none, то есть сжатие отключено.
compress_level или поле Level в опции Compression. По умолчанию используется 0, но конкретное значение зависит от алгоритма:
gzip- от-2(максимальная скорость) до9(максимальное сжатие)deflate- от-2(максимальная скорость) до9(максимальное сжатие)br- от0(максимальная скорость) до11(максимальное сжатие)zstd,lz4- игнорируется