指定できる引数が多く、その大半が任意であるため、ほとんどの API メソッドではキーワード引数を使用することを推奨します。ここに記載していないメソッドは API の一部とは見なされず、削除または変更される可能性があります。
クライアントの初期化
clickhouse_connect.driver.client クラスは、Python アプリケーションと ClickHouse サーバーをつなぐ主要なインターフェイスです。clickhouse_connect.get_client 関数を使用して Client インスタンスを取得します。この関数は、次の引数を受け取ります。
接続引数
HTTPS/TLS 引数
settings 引数
get_client の settings 引数は、各クライアントリクエストで追加の ClickHouse設定をサーバーに渡すために使用します。なお、ほとんどの場合、readonly=1 アクセスのユーザーはクエリとともに送信される設定を変更できないため、ClickHouse Connect はそのような設定を最終リクエストから除外し、警告をログに記録します。以下の設定は、ClickHouse Connect で使用される HTTP クエリ/セッションにのみ適用されるもので、一般的な ClickHouse設定としては文書化されていません。
各クエリとともに送信できるその他の ClickHouse設定については、ClickHouse ドキュメントを参照してください。
クライアント作成の例
- パラメータを指定しない場合、ClickHouse Connect クライアントは
localhostのデフォルトの HTTP ポートに、デフォルトユーザーdefault、パスワードなしで接続します:
- セキュアな (HTTPS) 外部 ClickHouse サーバー への接続
- セッション ID、その他のカスタム接続パラメータ、および ClickHouse 設定を使用した接続。
クライアントのライフサイクルとベストプラクティス
基本原則
- クライアントを再利用する: クライアントはアプリケーションの起動時に一度だけ作成し、その後はアプリケーションのライフサイクル全体を通して再利用します
- 頻繁な作成を避ける: クエリやリクエストのたびに新しいクライアントを作成しないでください (操作ごとに数百ミリ秒の無駄が生じます)
- 適切にクリーンアップする: シャットダウン時には、接続プールのリソースを解放するため、必ずクライアントを閉じてください
- 可能なら共有する: 1 つのクライアントで、接続プールを通じて多数の同時実行クエリを処理できます (詳しくは下記のスレッドに関する注記を参照してください)
基本パターン
マルチスレッドアプリケーション
適切なクリーンアップ
client.close() は、クライアントが自身のプールマネージャーを所有している場合にのみ (たとえば、カスタムの TLS/プロキシ オプションを指定して作成された場合) 、クライアントを破棄し、プールされた HTTP 接続を閉じます。デフォルトの共有プールを使用している場合は、ソケットを明示的に解放するために client.close_connections() を使用してください。そうしない場合、接続はアイドル期限切れ時およびプロセス終了時に自動的に回収されます。
複数のクライアントを使用する場面
- 異なるサーバー: ClickHouse サーバーまたはクラスターごとに 1 つのクライアントを使用する
- 異なる認証情報: ユーザーやアクセスレベルごとにクライアントを分ける
- 異なるデータベース: 複数のデータベースを扱う必要がある場合
- 分離されたセッション: 一時テーブルやセッション固有の設定のために、別々のセッションが必要な場合
- スレッドごとの分離: スレッドごとに独立したセッションが必要な場合 (前述のとおり)
共通のメソッド引数
parameters 引数または settings 引数、あるいはその両方を使用します。これらのキーワード引数については以下で説明します。
Parameters 引数
query* メソッドと command メソッドでは、Python の式を ClickHouse の値式にバインドするための、省略可能な parameters キーワード引数を指定できます。バインドには 2 種類あります。
サーバーサイドバインディング
{<name>:<datatype>} 形式のバインディング式を検出すると、適切なクエリパラメータを追加します。サーバーサイドバインディングでは、parameters 引数には Python の辞書を指定する必要があります。
- Python の辞書、DateTime 値、文字列値を使用したサーバーサイドバインディング
クライアントサイドバインディング
parameters 引数には辞書またはシーケンスを指定する必要があります。クライアントサイドバインディングでは、パラメータの置換に Python の “printf” スタイル の文字列フォーマットを使用します。
サーバーサイドバインディングとは異なり、クライアントサイドバインディングは、データベース、テーブル、カラム名などのデータベース識別子には使用できない点に注意してください。Python スタイルのフォーマットでは文字列の種類の違いを区別できず、それぞれ異なる形式でフォーマットする必要があるためです (データベース識別子にはバッククォートまたは二重引用符、データ値には単一引用符を使用します) 。
- Python の Dictionary、DateTime 値、文字列のエスケープを使用した Example
- PythonのSequence (Tuple) 、Float64、IPv4Addressを使用した例
DateTime64 引数 (秒未満の精度を持つ ClickHouse 型) をバインドするには、次の 2 つの独自の方法のいずれかを使用する必要があります。
- Python の
datetime.datetime値を、新しい DT64Param クラスでラップします。例:- パラメーターの値に辞書を使用する場合は、パラメーター名の末尾に文字列
_64を追加します
- パラメーターの値に辞書を使用する場合は、パラメーター名の末尾に文字列
Settings 引数
settings キーワード引数を受け付けます。settings 引数には辞書を指定する必要があります。各項目は、ClickHouse の設定名とそれに対応する値で構成されます。なお、値はサーバーにクエリパラメータとして送信される際に文字列に変換されます。
クライアントレベルの settings と同様に、ClickHouse Connect は、サーバーが readonly=1 としてマークした settings を、対応するログメッセージを出力したうえで除外します。ClickHouse HTTP インターフェイス 経由のクエリにのみ適用される settings は常に有効です。これらの settings については、get_client API で説明しています。
ClickHouse settings の使用例:
クライアント command メソッド
Client.command メソッドは、通常はデータを返さない SQL クエリや、完全なデータセットではなく単一のプリミティブ値または Array の値を返す SQL クエリを ClickHouse サーバーに送信するために使用します。このメソッドは次のパラメータを受け取ります。
コマンドの例
DDL文
単一の値を返すシンプルなクエリ
パラメータを指定するコマンド
設定付きのコマンド
Client query メソッド
Client.query メソッドは、ClickHouse サーバー から単一の「バッチ」データセットを取得するための基本的な方法です。大規模なデータセット (最大で約 100 万行) を効率よく転送するために、HTTP 上で Native ClickHouse フォーマットを使用します。このメソッドは次のパラメータを受け取ります。
クエリ例
基本的なクエリ
クエリ結果へのアクセス
クライアント側パラメータを使用するクエリ
サーバー側パラメータを使用したクエリ
設定を指定したクエリ
QueryResult オブジェクト
query メソッドは、以下の公開プロパティを持つ QueryResult オブジェクトを返します。
result_rows— 返されたデータを、行の Sequence として表した行列です。各行要素は、カラム値のシーケンスです。result_columns— 返されたデータを、カラムの Sequence として表した行列です。各カラム要素は、そのカラムに対応する行の値のシーケンスですcolumn_names—result_set内のカラム名を表す文字列のタプルcolumn_types—result_columns内の各カラムについて、ClickHouse のデータ型を表す ClickHouseType インスタンスのタプルquery_id— ClickHouse の query_id (system.query_logテーブルでクエリを調査する際に便利です)summary—X-ClickHouse-SummaryHTTP レスポンスヘッダーで返される任意のデータfirst_item— レスポンスの最初の行を辞書として取得するための便利なプロパティです (キーはカラム名です)first_row— 結果の最初の行を返すための便利なプロパティcolumn_block_stream— カラム指向フォーマットのクエリ結果を生成するジェネレーターです。このプロパティを直接参照しないでください (以下を参照) 。row_block_stream— 行指向フォーマットのクエリ結果を生成するジェネレーターです。このプロパティを直接参照しないでください (以下を参照) 。rows_stream— 呼び出すたびに1行ずつ返すクエリ結果のジェネレーターです。このプロパティを直接参照しないでください (以下を参照) 。summary—commandメソッドで説明したとおり、ClickHouse が返す要約情報の辞書
*_stream プロパティは、返されたデータのイテレーターとして使用できる Python の Context を返します。これらには、Client の *_stream メソッドを使用して間接的にのみアクセスしてください。
ストリーミングクエリ結果の詳細 (StreamContext オブジェクトを使用) は、高度なクエリ (ストリーミングクエリ) で説明しています。
NumPy、Pandas、Arrowでクエリ結果を処理する
クライアントのストリーミングクエリメソッド
クライアント insert メソッド
Client.insert メソッドを使用します。このメソッドは次のパラメータを受け取ります。
このメソッドは、「command」メソッドで説明されている「クエリ要約」辞書を返します。何らかの理由で挿入に失敗した場合は、例外が発生します。
Pandas DataFrames、PyArrow Tables、Arrow ベースの DataFrames で動作する専用の挿入メソッドについては、Advanced Inserting (Specialized Insert Methods) を参照してください。
NumPy 配列は有効な Sequence of Sequences であり、メインの
insert メソッドの data 引数として使用できるため、専用メソッドは必要ありません。例
(id UInt32, name String, age UInt8) を持つ既存のテーブル users があることを前提としています。
基本的な行指向 insert
カラム指向の insert
明示的なカラム型を指定した 挿入
特定のデータベースに挿入
ファイルからの挿入
Raw API
ユーティリティクラスと関数
clickhouse-connect の「公開」API の一部と見なされており、上で説明したクラスやメソッドと同様に、マイナーリリースをまたいで安定しています。これらのクラスや関数に対する破壊的変更は、マイナーリリース (パッチリリースではなく) でのみ行われ、少なくとも 1 回のマイナーリリースの間は非推奨の状態で提供されます。
例外
clickhouse_connect.driver.exceptions モジュールで定義されています。ドライバーが実際に検出した例外には、これらのいずれかの型が使用されます。
ClickHouse SQL ユーティリティ
clickhouse_connect.driver.binding モジュールの関数と DT64Param クラスを使用すると、ClickHouse SQL クエリを適切に構築し、エスケープできます。同様に、clickhouse_connect.driver.parser モジュールの関数を使用すると、ClickHouse のデータ型名をパースできます。