ClickHouse C# クライアント
ClickHouse に接続するための公式の C# クライアントです。 クライアントのソースコードは 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 を利用する:
使用方法
接続文字列パラメータ
| Parameter | Description | Default |
|---|---|---|
Host | ClickHouse サーバーアドレス | localhost |
Port | ClickHouse サーバーポート | 8123 または 8443(Protocol に依存) |
Database | 初期データベース | default |
Username | 認証ユーザー名 | default |
Password | 認証パスワード | (空) |
Protocol | 接続プロトコル(http または https) | http |
Compression | Gzip 圧縮を有効化 | true |
UseSession | 永続的なサーバーセッションを有効化 | false |
SessionId | カスタムセッション ID | ランダムな 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 フラグを有効にすると、任意の時点で 1 接続あたり 1 つのアクティブなクエリに制限されます(サーバー側の制約です)。
接続の有効期間とプーリング
ClickHouse.Driver は内部的に System.Net.Http.HttpClient を使用しています。HttpClient はエンドポイントごとに接続プールを持ちます。その結果:
ClickHouseConnectionオブジェクトは TCP 接続と 1:1 で対応していません。複数のデータベースセッションは、サーバーごとに複数の(デフォルトでは 2 本の)TCP 接続上で多重化されます。ClickHouseConnectionオブジェクトが破棄された後も、接続が維持される場合があります。- この挙動は、カスタムの
HttpClientHandlerを指定した独自のHttpClientを渡すことで調整できます。
DI 環境向けには、HTTP クライアントの設定を共通化できる専用コンストラクター ClickHouseConnection(string connectionString, IHttpClientFactory httpClientFactory, string httpClientName = "") が用意されています。
推奨事項:
ClickHouseConnectionはサーバーとの「セッション」を表します。サーバーのバージョンを問い合わせることで機能検出を行うため(接続オープン時にわずかなオーバーヘッドがあります)が、一般的にはこのオブジェクトを何度も生成・破棄しても問題ありません。- コネクションの推奨ライフタイムは、複数のクエリにまたがる大きな「トランザクション」あたり 1 つの接続オブジェクトとすることです。接続の開始時にはわずかなオーバーヘッドがあるため、クエリごとに接続オブジェクトを生成することは推奨されません。
- アプリケーションが大量のトランザクションを扱い、
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:
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)→ 任意の型を要素とするArrayTuple(T1, T2, ...)→ 任意の型を要素とするTupleNullable(T)→ 任意の型のNullable版Map(K, V)→Dictionary<K, V>型
DateTime の扱い
ClickHouse.Driver は、タイムゾーンと DateTime.Kind プロパティを正しく扱うようにしています。具体的には次のとおりです。
DateTimeの値は UTC として返されます。ユーザーは必要に応じて自分で変換するか、DateTimeインスタンスに対してToLocalTime()メソッドを使用できます。- 挿入時には、
DateTimeの値は次のように扱われます。UTCのDateTimeはそのまま挿入されます。これは、ClickHouse が内部的に UTC で値を保存しているためです。LocalのDateTimeは、ユーザーのローカルタイムゾーン設定に従って UTC に変換されます。UnspecifiedのDateTimeは対象カラムのタイムゾーンに属しているとみなされ、そのタイムゾーンに従って UTC に変換されます。
- タイムゾーンが指定されていないカラムの場合、既定ではクライアントのタイムゾーンが使用されます(従来の動作)。代わりにサーバーのタイムゾーンを使用するには、接続文字列の
UseServerTimezoneフラグを使用できます。
ロギングと診断
ClickHouse の .NET クライアントは Microsoft.Extensions.Logging の抽象 API と統合されており、軽量なオプトイン方式のロギングを提供します。ロギングを有効にすると、ドライバーは接続ライフサイクルイベント、コマンド実行、トランスポート処理、およびバルクコピーアップロードに対して構造化されたメッセージを出力します。ロギングは完全に任意であり、ロガーを構成していないアプリケーションでも追加のオーバーヘッドなしに動作し続けます。
クイックスタート
ClickHouseConnection の使用
appsettings.json の使用
標準的な .NET の構成機能を使用してログレベルを設定できます。
インメモリ設定を使用する
コード内でカテゴリごとにログ出力の詳細度を設定することもできます。
カテゴリと出力元
このドライバーは専用のカテゴリを使用しており、コンポーネントごとにログレベルをきめ細かく調整できます。
| Category | Source | Highlights |
|---|---|---|
ClickHouse.Driver.Connection | ClickHouseConnection | 接続のライフサイクル、HTTP クライアントファクトリの選択、接続の開始/終了、セッション管理。 |
ClickHouse.Driver.Command | ClickHouseCommand | クエリ実行の開始/完了、処理時間、クエリ ID、サーバー統計情報、エラーの詳細。 |
ClickHouse.Driver.Transport | ClickHouseConnection | 低レベルの HTTP ストリーミングリクエスト、圧縮フラグ、レスポンスステータスコード、転送エラー。 |
ClickHouse.Driver.BulkCopy | ClickHouseBulkCopy | メタデータの読み込み、バッチ処理、行数、アップロード完了。 |
例:接続に関する問題の診断
これにより、次の内容がログに記録されます:
- HTTP クライアントファクトリの選択(デフォルトプールか単一接続か)
- HTTP ハンドラの設定(SocketsHttpHandler または HttpClientHandler)
- 接続プールの設定(MaxConnectionsPerServer、PooledConnectionLifetime など)
- タイムアウトの設定(ConnectTimeout、Expect100ContinueTimeout など)
- SSL/TLS 設定
- 接続のオープン/クローズ イベント
- セッション ID の追跡
デバッグモード: ネットワークトレースと診断
ネットワークに関する問題の診断を支援するために、ドライバーライブラリには .NET のネットワーク内部処理を低レベルでトレースできるヘルパー機能が含まれています。これを有効にするには、ログレベルを Trace に設定した LoggerFactory を渡し、EnableDebugMode を true に設定する必要があります(または ClickHouse.Driver.Diagnostic.TraceHelper クラスを使用して手動で有効化します)。警告: これは非常に冗長なログを大量に生成し、パフォーマンスに影響します。本番環境でデバッグモードを有効にすることは推奨されません。
ORM & Dapper サポート
ClickHouse.Driver は Dapper(いくつかの制限付きで)をサポートします。
動作サンプル:
サポート対象外: