Клиент ClickHouse для C#
Официальный клиент C# для подключения к ClickHouse. Исходный код клиента доступен в репозитории GitHub. Изначально разработан Oleg V. Kozlyuk.
Руководство по миграции
- Обновите файл
.csproj, указав новое имя пакетаClickHouse.Driverи последнюю версию на NuGet. - Замените все вхождения
ClickHouse.ClientнаClickHouse.Driverв вашей кодовой базе.
Поддерживаемые версии .NET
ClickHouse.Driver поддерживает следующие версии .NET:
- .NET Framework 4.6.2
- .NET Framework 4.8
- .NET Standard 2.1
- .NET 6.0
- .NET 8.0
- .NET 9.0
- .NET 10.0
Установка
Установите пакет из NuGet:
Или с помощью менеджера пакетов NuGet:
Быстрый старт
Использование Dapper:
Использование
Параметры строки подключения
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
Host | Адрес сервера ClickHouse | localhost |
Port | Порт сервера ClickHouse | 8123 или 8443 (в зависимости от Protocol) |
Database | Начальная база данных | default |
Username | Имя пользователя для аутентификации | default |
Password | Пароль для аутентификации | (пусто) |
Protocol | Протокол подключения (http или https) | http |
Compression | Включает сжатие Gzip | true |
UseSession | Включает постоянную серверную сессию | false |
SessionId | Пользовательский идентификатор сессии | Случайный GUID |
Timeout | HTTP‑тайм-аут (в секундах) | 120 |
UseServerTimezone | Использовать часовой пояс сервера для столбцов datetime | true |
UseCustomDecimals | Использовать ClickHouseDecimal для десятичных чисел | false |
Пример: Host=clickhouse;Port=8123;Username=default;Password=;Database=default
Флаг UseSession включает сохранение серверной сессии, что позволяет использовать операторы SET и временные таблицы. Сессия будет сброшена после 60 секунд бездействия (тайм-аут по умолчанию). Время жизни сессии можно увеличить, задав параметры сессии с помощью операторов ClickHouse.
Класс ClickHouseConnection обычно поддерживает параллельную работу (несколько потоков могут выполнять запросы одновременно). Однако включение флага UseSession ограничит выполнение одним активным запросом на соединение в любой момент времени (ограничение на стороне сервера).
Время жизни соединения и пул подключений
ClickHouse.Driver внутренне использует System.Net.Http.HttpClient. HttpClient имеет пул подключений для каждой конечной точки (endpoint). В результате:
- Объект
ClickHouseConnectionне имеет отображения 1:1 на TCP‑соединения — несколько сеансов работы с базой данных будут мультиплексироваться поверх нескольких (2 по умолчанию) TCP‑соединений на один сервер. - Соединения могут оставаться активными после удаления объекта
ClickHouseConnection. - Это поведение можно настроить, передав собственный
HttpClientс пользовательскимHttpClientHandler.
Для DI‑окружений предусмотрен специальный конструктор ClickHouseConnection(string connectionString, IHttpClientFactory httpClientFactory, string httpClientName = ""), который позволяет централизованно настраивать HTTP‑клиент.
Рекомендации:
ClickHouseConnectionпредставляет собой «сеанс» с сервером. Он выполняет обнаружение возможностей, запрашивая версию сервера (что вносит небольшие накладные расходы при открытии), но в целом безопасно многократно создавать и уничтожать такие объекты.- Рекомендуемый срок жизни соединения — один объект соединения на одну крупную «транзакцию», охватывающую несколько запросов. Поскольку при установке соединения есть небольшие накладные расходы, не рекомендуется создавать объект соединения для каждого запроса.
- Если приложение обрабатывает большие объёмы транзакций и ему необходимо часто создавать и уничтожать объекты
ClickHouseConnection, рекомендуется использоватьIHttpClientFactoryили статический экземплярHttpClientдля управления соединениями.
Создание таблицы
Создайте таблицу с использованием стандартного синтаксиса SQL:
Вставка данных
Вставляйте данные с использованием параметризованных запросов:
Массовая вставка
Для использования ClickHouseBulkCopy необходимы:
- Целевое подключение (экземпляр
ClickHouseConnection) - Имя целевой таблицы (свойство
DestinationTableName) - Источник данных (
IDataReaderилиIEnumerable<object[]>)
- Для оптимальной производительности ClickHouseBulkCopy использует Task Parallel Library (TPL) для обработки пакетов данных с использованием до 4 параллельных задач вставки (это можно настроить).
- Имена столбцов при необходимости могут быть переданы через свойство
ColumnNames, если в исходных данных столбцов меньше, чем в целевой таблице. - Настраиваемые параметры:
Columns,BatchSize,MaxDegreeOfParallelism. - Перед копированием выполняется запрос
SELECT * FROM <table> LIMIT 0для получения информации о структуре целевой таблицы. Типы передаваемых объектов должны разумно соответствовать типам столбцов целевой таблицы. - Сессии несовместимы с параллельной вставкой. Подключение, передаваемое в
ClickHouseBulkCopy, должно быть без сессий, либо параметрMaxDegreeOfParallelismдолжен быть установлен в значение1.
Выполнение запросов SELECT
Выполните запросы SELECT и обработайте результаты:
Необработанный стриминг
Поддержка вложенных столбцов
Вложенные типы ClickHouse (Nested(...)) можно читать и записывать с использованием семантики массивов.
Столбцы типа AggregateFunction
Столбцы типа AggregateFunction(...) нельзя напрямую использовать в запросах или при вставке данных.
Для вставки:
Чтобы выбрать:
Параметры SQL
При передаче параметров в запрос следует использовать форматирование параметров ClickHouse в следующем формате:
Примеры:
- Параметры привязки SQL (bind) передаются как параметры HTTP URI-запроса, поэтому при их чрезмерном количестве может возникнуть исключение «URL too long».
- Для вставки большого объёма записей рассмотрите использование механизма пакетной вставки (Bulk Insert).
Поддерживаемые типы данных
ClickHouse.Driver поддерживает следующие типы данных ClickHouse с их соответствующими сопоставлениями с типами .NET:
Логические типы
Bool→bool
Числовые типы
Знаковые целые типы:
Int8→sbyteInt16→shortInt32→intInt64→longInt128→BigIntegerInt256→BigInteger
Беззнаковые целые типы:
UInt8→byteUInt16→ushortUInt32→uintUInt64→ulongUInt128→BigIntegerUInt256→BigInteger
Типы с плавающей запятой:
Float32→floatFloat64→double
Десятичные типы:
Decimal→decimalDecimal32→decimalDecimal64→decimalDecimal128→decimalDecimal256→BigDecimal
Строковые типы
String→stringFixedString→string
Типы данных даты и времени
Date→DateTimeDate32→DateTimeDateTime→DateTimeDateTime32→DateTimeDateTime64→DateTime
Типы сетей
IPv4→IPAddressIPv6→IPAddress
Географические типы
Point→TupleRing→Array of PointsPolygon→Array of Rings
Составные типы данных
Array(T)→Массив любого типаTuple(T1, T2, ...)→Кортеж любых типовNullable(T)→Nullable-тип на основе любого типаMap(K, V)→Словарь<K, V>
Обработка DateTime
ClickHouse.Driver корректно обрабатывает часовые пояса и свойство DateTime.Kind. В частности:
- Значения
DateTimeвозвращаются в UTC. Пользователь затем может преобразовать их самостоятельно или использовать методToLocalTime()для экземпляраDateTime. - При вставке данные типа
DateTimeобрабатываются следующим образом:UTCDateTimeвставляются «как есть», поскольку ClickHouse хранит их в UTC.LocalDateTimeпреобразуются в UTC в соответствии с локальными настройками часового пояса пользователя.UnspecifiedDateTimeсчитаются находящимися в часовом поясе целевого столбца и, следовательно, преобразуются в UTC в соответствии с этим часовым поясом.
- Для столбцов без указанного часового пояса по умолчанию используется часовой пояс клиента (устаревшее поведение). Вместо этого можно использовать флаг
UseServerTimezoneв строке подключения, чтобы применять часовой пояс сервера.
Журналирование и диагностика
Клиент ClickHouse для .NET интегрируется с абстракциями логирования Microsoft.Extensions.Logging, предоставляя легковесное журналирование, подключаемое по желанию. При его включении драйвер генерирует структурированные сообщения о событиях жизненного цикла подключения, выполнении команд, транспортных операциях и массовой загрузке данных. Журналирование полностью необязательно — приложения, которые не настраивают логгер, продолжают работать без дополнительных накладных расходов.
Быстрый старт
Использование ClickHouseConnection
Использование appsettings.json
Вы можете настроить уровни логирования с помощью стандартной системы конфигурации .NET:
Использование конфигурации в оперативной памяти
Вы также можете настроить детализацию логирования по категориям прямо в коде:
Категории и источники
Драйвер использует отдельные категории, чтобы вы могли точно настраивать уровни логирования для каждого компонента:
| Category | Source | Highlights |
|---|---|---|
ClickHouse.Driver.Connection | ClickHouseConnection | Жизненный цикл соединения, выбор фабрики HTTP‑клиента, открытие/закрытие соединения, управление сессиями. |
ClickHouse.Driver.Command | ClickHouseCommand | Начало и завершение выполнения запроса, замер времени, идентификаторы запросов, статистика сервера и сведения об ошибках. |
ClickHouse.Driver.Transport | ClickHouseConnection | Низкоуровневые потоковые HTTP‑запросы, флаги сжатия, коды статуса ответа и сбои транспортного уровня. |
ClickHouse.Driver.BulkCopy | ClickHouseBulkCopy | Загрузка метаданных, пакетные операции, количество строк и завершение отправки. |
Пример: диагностика неполадок подключения
В журнал будет записано:
- выбор фабрики HTTP-клиента (пул по умолчанию по сравнению с одиночным подключением)
- конфигурация HTTP-обработчика (SocketsHttpHandler или HttpClientHandler)
- настройки пула подключений (MaxConnectionsPerServer, PooledConnectionLifetime и т. д.)
- параметры тайм-аутов (ConnectTimeout, Expect100ContinueTimeout и т. д.)
- конфигурация SSL/TLS
- события открытия и закрытия подключений
- отслеживание идентификаторов сессий
Режим отладки: трассировка сети и диагностика
Чтобы упростить диагностику сетевых проблем, библиотека драйвера предоставляет вспомогательный инструмент, позволяющий включить низкоуровневую трассировку внутренних сетевых механизмов .NET. Чтобы включить её, необходимо передать LoggerFactory с уровнем Trace и установить EnableDebugMode в значение true (или включить её вручную через класс ClickHouse.Driver.Diagnostic.TraceHelper). Предупреждение: это приведёт к генерации чрезвычайно подробных логов и повлияет на производительность. Не рекомендуется включать режим отладки в боевой (production) среде.
Поддержка ORM и Dapper
ClickHouse.Driver поддерживает Dapper (с некоторыми ограничениями).
Рабочий пример:
Не поддерживается: