ClickHouse.Ado
2.0.2.2
See the version list below for details.
dotnet add package ClickHouse.Ado --version 2.0.2.2
NuGet\Install-Package ClickHouse.Ado -Version 2.0.2.2
<PackageReference Include="ClickHouse.Ado" Version="2.0.2.2" />
paket add ClickHouse.Ado --version 2.0.2.2
#r "nuget: ClickHouse.Ado, 2.0.2.2"
// Install ClickHouse.Ado as a Cake Addin #addin nuget:?package=ClickHouse.Ado&version=2.0.2.2 // Install ClickHouse.Ado as a Cake Tool #tool nuget:?package=ClickHouse.Ado&version=2.0.2.2
ClickHouse.ADO
.NET driver for Yandex ClickHouse. This driver implements native ClickHouse protocol, shamelessly ripped out of original ClickHouse sources. In some ways it does not comply to ADO.NET rules however this is intentional.
А ещё есть описание по-русски, см. ниже.
Changelog
v.2.0.2.1 and v.2.0.2.2: Added net461 target and downgraded K4os.Compression.LZ4 requirement for it.
v.2.0.2: Switched to async IO, implemented System.Data.Common stuff like DbProviderFactory. Added support for IPv4 and IPv6 columns.
v.1.5.5-no-polling-on-tls: Patched a bug preventing SSL/TLS secured connections from working properly.
v.1.5.5: Added support for Bool type.
v.1.5.3: Fixed errors reading empty arrays.
v.1.5.2: Added support for Date32 type.
v.1.5.1: Introduced new way to handle Clickhouse's Tuple
type. Now values are read as System.Tuple<>
instead of System.Object[]
. That change made possible reading of Array(Tuple(...))
typed values.
v.1.4.0: Fixed query parsing when values are escaped.
v.1.3.1: Added support for LowCardinality type. Extended support for Decimal types.
v.1.2.6: Added (quite limited) support for timezones.
Important usage notes
SSL/TLS support
In order to wrap your clickhouse connection in SSL/TLS tunnel you should enable is on your server first (tcp_port_secure
setting in the config.xml) and add Encrypt=True
to the connection string (do not forget to change port number).
SSL/TLS was not working properly before 1.5.5 and led to infinite wait for data to arrive. It was 'patched' in 1.5.5-no-polling-on-tls version and completely mitigated in 2.x+.
Raw SQL debug output
If you'd like to see all queries emitted by the driver to the server add Trace=True
to the connection string and set up a .NET trace listener for the category ClickHouse.Ado
.
No multiple queries
ClickHouse engine does not support parsing multiple queries per on IDbCommand.Execute*
roundtrip. Please split your queries into separately executed commands.
Always use NextResult
Although you may think that NextResult
would not be used due to aforementioned lack of multiple query support that's completely wrong! You must always use NextResult
as ClickHouse protocol and engine may and will return multiple resultsets per query and sometime result schemas may differ (definetly in regard to field
ordering if query doesn't explicitly specify it).
Hidden bulk-insert functionality
If you read ClickHouse documentation it strongly advices you to insert records in bulk (1000+ per request). This driver can do bulk inserts. To do so you have to use special insert syntax:
INSERT INTO some_table (col1, col2, col3) VALUES @bulk
And after that you must add parameted named bulk
with its Value
castable to IEnumerable
each item of it must be IEnumerable
too. Empty lists are not allowed.
Alternatively you may pass IBulkInsertEnumerable
implementation as a bulk
's value to speed up processing and use less memory inside clickhouse driver.
This may be used conviniently with the following syntax:
CREATE TABLE test (date Date, time DateTime, str String, int UInt16) ENGINE=MergeTree(date,(time,str,int), 8192)
class MyPersistableObject:IEnumerable{
public string MyStringField;
public DateTime MyDateField;
public int MyIntField;
//Count and order of returns must match column order in SQL INSERT
public IEnumerator GetEnumerator(){
yield return MyDateField;
yield return MyDateField;
yield return MyStringField;
yield return (ushort)MyIntField;
}
}
//... somewhere elsewhere ...
var list=new List<MyPersistableObject>();
// fill the list to insert
list.Add(new MyPersistableObject());
var command=connection.CreateCommand();
command.CommandText="INSERT INTO test (date,time,str,int) VALUES @bulk";
command.Parameters.Add(new ClickHouseParameter{
ParameterName="bulk",
Value=list
});
command.ExecuteNonQuery();
Extending and deriving
If you've fixed some bugs or wrote some useful addition to this driver, please, do pull request them back here.
If you need some functionality or found a bug but unable to implement/fix it, please file a ticket here, on GitHub.
ClickHouse.ADO по-русски
.NET драйвер для Yandex ClickHouse. В отличие от официального JDBC клиента этот драйвер не является обёрткой поверх ClickHouse HTTP, а реализует нативный протокол. Протокол (и части его реализации) нагло выдраны из исходников самого ClickHouse. В некоторых случаях этот драйвер ведёт себя не так, как обычные ADO.NET драйверы, это сделано намеренно и связано со спецификой ClickHouse.
Важные изменения
v.2.0.2.1 и v.2.0.2.2: Добавлена цель net461 и для неё снижено требование к версии K4os.Compression.LZ4.
v.2.0.2: Переход на асинхронный ввод/вывод, реализация всякого из System.Data.Common, в том числе DbProviderFactory. Добавлена поддержка типов IPv4 and IPv6.
v.1.5.5-no-polling-on-tls: "Исправлен" баг с повисаниями на соединениях использующих SSL/TLS.
v.1.5.5: Добавлена поддержка типа Bool.
v.1.5.3: Исправлена ошибка чтения пустых массивов.
v.1.5.2: Добавлена поддержка типа Date32.
v.1.5.1. Изменён формат чтения/записи Clickhouse типа Tuple
. Теперь значения читаются как System.Tuple<>
вместо используемого ранее System.Object[]
. Это изменение позволяет читать колонки типа Array(Tuple(...))
, что раньше было не возможно из-за ошибок.
v.1.4.0: Исправлен разбор запросов с значениями содержащими экранированные символы.
v.1.3.1: Добавлена поддержка типа LowCardinality. Улучшена работа с типами Decimal.
v.1.2.6: Добавлена ограниченная поддержка временных зон.
Прочти это перед использованием
Поддержка SSL/TLS
Чтобы завернуть протокол кликхауса в SSL/TLS тунель надо, во-первых, включить SSL на сервере (настройка tcp_port_secure
в config.xml), и, затем, добавить Encrypt=True
в строку соединения (также не забыть сменить используемый номер порта).
До версии 1.5.5-no-polling-on-tls SSL/TLS нормально не работал и приводил к зависаниям. В 1.5.5-no-polling-on-tls это было "исправлено", а в версиях 2.х+ полностью устранено.
Отладочный вывод SQL
Если хочется видеть какие SQL драйвер посылает серверу, то в строку соединения надо добавить Trace=True
и включить слушатель трассировки для категории ClickHouse.Ado
.
Нет поддержки нескольких запросов
Движок ClickHouse не умеет обрабатывать несколько SQL запросов за один вызов IDbCommand.Execute*
. Запросы надо разбивать на отдельные команды.
Всегда используй NextResult
В связи с вышесказаным может показаться что NextResult
не нужен, но это совершенно не так. Использование NextResult
обязательно, поскольку протокол и движок ClickHouse может и будет возвращать несколько наборов данных на один запрос, и, хуже того, схемы этих наборов могут различаться (по крайней мере может быть перепутан порядок полей, если запрос не имеет явного указания порядка).
Секретная функция групповой вставки
В документации ClickHouse указано, что вставлять данные лучше пачками 100+ записей. Для этого предусмотрен специальный синтаксис:
INSERT INTO some_table (col1, col2, col3) VALUES @bulk
Для этой команды надо задать параметр bulk
со значением Value
приводимым к IEnumerable
, каждый из элементов которого, в свою очередь, тоже должен быть IEnumerable
.
Кроме того, в качестве значения параметра bulk
передать объект реализующий IBulkInsertEnumerable
- это уменьшит использование памяти и процессора внутри драйвера clickhouse.
Это удобно при использовании такого синтаксиса:
CREATE TABLE test (date Date, time DateTime, str String, int UInt16) ENGINE=MergeTree(date,(time,str,int), 8192)
class MyPersistableObject:IEnumerable{
public string MyStringField;
public DateTime MyDateField;
public int MyIntField;
//Количество и порядок return должны соответствовать количеству и порядку полей в SQL INSERT
public IEnumerator GetEnumerator(){
yield return MyDateField;
yield return MyDateField;
yield return MyStringField;
yield return (ushort)MyIntField;
}
}
//... где-то ещё ...
var list=new List<MyPersistableObject>();
// заполнение списка вставляемых объектов
list.Add(new MyPersistableObject());
var command=connection.CreateCommand();
command.CommandText="INSERT INTO test (date,time,str,int) VALUES @bulk";
command.Parameters.Add(new ClickHouseParameter{
ParameterName="bulk",
Value=list
});
command.ExecuteNonQuery();
Расширение и наследование
Если вы исправили баг или реализовали какую-то фичу, пожалуйста, сделайте pull request в этот репозиторий.
Если вам не хватает какой-то функции или вы нашли баг, который не можете исправить, напишите тикет здесь, на GitHub.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.1 is compatible. |
.NET Framework | net461 is compatible. net462 is compatible. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.6.1
- K4os.Compression.LZ4 (>= 1.2.16)
-
.NETFramework 4.6.2
- K4os.Compression.LZ4 (>= 1.3.7-beta)
-
.NETStandard 2.1
- K4os.Compression.LZ4 (>= 1.3.7-beta)
-
net6.0
- K4os.Compression.LZ4 (>= 1.3.7-beta)
-
net7.0
- K4os.Compression.LZ4 (>= 1.3.7-beta)
NuGet packages (13)
Showing the top 5 NuGet packages that depend on ClickHouse.Ado:
Package | Downloads |
---|---|
ClickHouse.Net
Provides abstractions and helpers for ClickHouse.Ado. |
|
CJENetworkLogger
.NET-based framework for building client-server applications |
|
Dapper.Contrib.BulkInsert
Dapper bulk insert with Dapper. |
|
CloudYxt.ClickHouse
云享通.Net Corec基于ClickHouse.Ado驱动建立常规数据操作库。 |
|
ClickHouse.Ado.Client
Package Description |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
2.0.5 | 40,159 | 5/9/2024 |
2.0.4 | 2,492 | 4/30/2024 |
2.0.3 | 30,404 | 3/22/2024 |
2.0.2.2 | 36,361 | 11/7/2023 |
2.0.2.1 | 220 | 11/2/2023 |
2.0.2 | 833 | 10/25/2023 |
2.0.2-preview | 4,187 | 10/11/2023 |
2.0.1-preview | 874 | 10/10/2023 |
2.0.0-preview | 110 | 10/10/2023 |
1.5.6-no-polling-on-tls | 125 | 3/22/2024 |
1.5.5 | 125,703 | 6/2/2023 |
1.5.5-no-polling-on-tls | 2,435 | 10/10/2023 |
1.5.4 | 87,361 | 3/2/2023 |
1.5.3 | 39,451 | 10/5/2022 |
1.5.2 | 3,455 | 9/27/2022 |
1.5.1 | 185,863 | 4/21/2022 |
1.4.3 | 5,845 | 4/5/2022 |
1.4.2 | 63,826 | 1/21/2022 |
1.4.0 | 134,691 | 8/9/2021 |
1.3.1 | 99,059 | 3/11/2021 |
1.2.6 | 54,363 | 10/27/2020 |
1.2.5 | 3,530 | 10/19/2020 |
1.2.4 | 9,616 | 9/16/2020 |
1.2.3 | 3,416 | 8/31/2020 |
1.2.2 | 2,179 | 8/25/2020 |
1.2.1 | 13,232 | 4/13/2020 |
1.2.0-preview-02 | 560 | 3/19/2020 |
1.2.0-preview-01 | 402 | 3/19/2020 |
1.1.21 | 22,991 | 2/4/2020 |
1.1.20 | 64,069 | 9/30/2019 |
1.1.19 | 1,770 | 9/23/2019 |
1.1.17 | 32,775 | 6/5/2019 |
1.1.16 | 736 | 5/30/2019 |
1.1.15 | 33,936 | 5/23/2019 |
1.1.13 | 16,799 | 1/28/2019 |
1.1.9 | 107,860 | 7/9/2018 |
1.1.7 | 1,110 | 7/5/2018 |
1.1.6 | 2,268 | 5/12/2018 |
1.1.5 | 21,846 | 11/27/2017 |
1.1.4 | 1,094 | 11/7/2017 |
1.1.3 | 1,049 | 11/3/2017 |
1.1.2 | 3,776 | 8/28/2017 |
1.1.1 | 1,481 | 6/21/2017 |
1.1.0 | 1,147 | 6/21/2017 |
1.0.2 | 1,183 | 6/2/2017 |
1.0.1 | 1,140 | 5/29/2017 |
1.0.0 | 1,475 | 4/26/2017 |