database/sql, или «стандартный» API, позволяет использовать клиент в сценариях, где прикладной код должен оставаться независимым от конкретной базы данных за счёт соответствия стандартному интерфейсу. Это имеет свою цену: дополнительные уровни абстракции и косвенности, а также примитивы, не всегда согласующиеся с ClickHouse. Однако такие издержки обычно приемлемы в сценариях, где инструментам нужно подключаться к нескольким базам данных.
Кроме того, этот клиент поддерживает использование HTTP в качестве транспортного уровня — при этом данные по-прежнему кодируются в формате Native для оптимальной производительности.
Подключение
Подключиться можно либо с помощью строки DSN в форматеclickhouse://<host>:<port>?<query_option>=<value> и метода Open, либо через метод clickhouse.OpenDB. Последний не входит в спецификацию database/sql, но возвращает экземпляр sql.DB. Этот метод предоставляет дополнительные возможности, например доступ к данным профилирования, для которых спецификация database/sql не предлагает очевидного способа предоставления.
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-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
По умолчанию соединения устанавливаются по собственному протоколу. Если вам нужен HTTP, это можно включить: либо изменить DSN, добавив 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.
Серверные параметры запроса
Стандартный API поддерживает серверные параметры запроса ClickHouse с помощью типизированных плейсхолдеров{name:Type} и значений clickhouse.Named:
string/*string или []byte/*[]byte, переданное через clickhouse.Named, считается литералом и экранируется драйвером, поэтому при обратимом обмене оно сохраняется байт в байт. Если в передаваемых данных нужен именно символ перевода строки или табуляции, используйте в значении Go настоящий символ:
Escaped, используйте вместо этого WithParameters. Подробное описание типов, экранирования и отличий {name:Type} от привязки на стороне клиента см. в разделе Серверные параметры запроса.
Полный пример для стандартного API
Привязка параметров
Стандартный 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, то есть сжатие отключено.
compress_level или поле Level в опции Compression. По умолчанию используется 0, но конкретное значение зависит от алгоритма:
gzip- от-2(максимальная скорость) до9(максимальное сжатие)deflate- от-2(максимальная скорость) до9(максимальное сжатие)br- от0(максимальная скорость) до11(максимальное сжатие)zstd,lz4- игнорируется