Подключение
default.
Обратите внимание, что для подключения используется стандартный порт native.
conn уже создана и доступна.
Выполнение
Exec. Это полезно для DDL и простых операторов. Его не следует использовать для крупных вставок или перебора результатов запросов.
Вставка батчами
Send(). До вызова Send батчи хранятся в памяти.
Рекомендуется вызывать Close для батча, чтобы избежать утечки соединений. Это можно сделать с помощью ключевого слова defer сразу после подготовки батча. Это освободит соединение, если Send так и не будет вызван. Обратите внимание: если строки не добавлялись, в журнале запросов в этом случае будет отображаться 0 вставленных строк.
Эфемерные столбцы
Запрос строк
QueryRow, либо получить курсор для итерации по результирующему набору через Query. В первом случае метод принимает пункт назначения, в который будут сериализованы данные, а во втором для каждой строки нужно вызывать Scan.
SELECT — по умолчанию в случае SELECT *, как показано выше, используется порядок объявления столбцов.
Как и при вставке, метод Scan требует, чтобы переменные-приёмники имели подходящий тип. При этом сохраняется гибкость: где возможно, типы преобразуются, если это не приводит к потере точности; например, в примере выше столбец UUID считывается в строковую переменную. Полный список поддерживаемых типов Go для каждого типа столбца см. в разделе Преобразования типов.
Наконец, обратите внимание, что в методы Query и QueryRow можно передавать Context. Это можно использовать для настроек на уровне запроса — подробнее см. в разделе Использование контекста.
Асинхронная вставка
Столбцовая вставка
Использование структур
Select с сериализацией
Сканирование в структуру
ScanStruct позволяет записать одну строку результата запроса в структуру.
Добавление структуры
AppendStruct позволяет добавить структуру в существующий батч и интерпретировать её как полную строку. Для этого необходимо, чтобы столбцы структуры соответствовали таблице и по имени, и по типу. Хотя для каждого столбца должно быть эквивалентное поле структуры, некоторые поля структуры могут не иметь соответствующего представления в столбцах. Они будут просто проигнорированы.
Привязка параметров
Exec, Query и QueryRow. Как показано в примере ниже, поддерживаются именованные, нумерованные и позиционные параметры. Ниже приведены соответствующие примеры.
Особые случаи
[ ], следует использовать ArraySet.
Если требуются группы/кортежи в обрамлении ( ), например для использования с операторами IN, можно использовать GroupSet. Это особенно полезно, когда требуется несколько групп, как показано в примере ниже.
Наконец, для полей DateTime64 необходимо указывать precision, чтобы параметры отображались корректно. Однако уровень precision для поля клиенту неизвестен, поэтому пользователь должен указать его самостоятельно. Для этого предусмотрен параметр DateNamed.
Использование контекста
context.Background(), эту возможность можно использовать для передачи настроек и дедлайнов, а также для отмены запросов.
Передача контекста, созданного с помощью withDeadline, позволяет задавать ограничения на время выполнения запросов. Обратите внимание: это абсолютное время, и по истечении срока будет только освобождено соединение и отправлен сигнал отмены в ClickHouse. В качестве альтернативы для явной отмены запроса можно использовать WithCancel.
Вспомогательные функции clickhouse.WithQueryID и clickhouse.WithQuotaKey позволяют указать Query id и ключ квоты. Query id может быть полезен для отслеживания запросов в журналах и для их отмены. Ключ квоты можно использовать, чтобы накладывать ограничения на использование ClickHouse на основе уникального значения ключа — подробнее см. в разделе Управление квотами.
Контекст также можно использовать, чтобы настройка применялась только к конкретному запросу, а не ко всему соединению, как показано в разделе Настройки соединения.
Наконец, размер буфера block можно задать с помощью clickhouse.WithBlockSize. Это переопределяет настройку уровня соединения BlockBufferSize и задает максимальное число blocks, которые декодируются и одновременно хранятся в памяти. Более высокие значения потенциально дают больше параллелизма, но ценой большего потребления памяти.
Примеры всего перечисленного приведены ниже.
Информация о Прогрессе, профиле и Log
Динамическое сканирование
Внешние таблицы
ext.NewTable, а затем передать её через объект контекста.
OpenTelemetry
clickhouse.WithSpan, чтобы привязать спан к запросу через контекст.
Ограничение HTTP-транспортаХотя сервер ClickHouse принимает стандартные HTTP-заголовки
traceparent / tracestate, HTTP-транспорт clickhouse-go сейчас их не отправляет — WithSpan не работает через HTTP. В качестве обходного решения можно задать заголовки вручную через HttpHeaders в параметрах подключения.