任意パラメータが多いクライアントファクトリーやメソッドでは、引数をキーワードで渡してください。ここに記載していないメソッドは API の一部とは見なされず、削除または変更される可能性があります。
クライアントの初期化
Client を作成するには clickhouse_connect.get_client を使用します。ネイティブの AsyncClient を作成するには、async エクストラをインストールし、clickhouse_connect.get_async_client を await します。
接続引数
非同期ファクトリでは、aiohttp の接続プールを設定するために、
connector_limit=100、connector_limit_per_host=20、keepalive_timeout=30.0 も指定できます。pool_mgr は指定できません。同期 chDB バックエンドでは path と chdb_options を指定できます。詳しくは 埋め込み chDB バックエンド を参照してください。
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 設定を使用した接続。
埋め込み chDB バックエンド
clickhouse-connect[chdb] をインストールします。これにより、同期クライアントのクエリ、insert、streaming、Arrow の各メソッドを利用できます。
path="/data/my_chdb" を渡すか、dsn="chdb:///data/my_chdb" を使用します。バックエンドでは、プロセスごとに指定できる engine の path は 1 つだけで、get_async_client や external data には対応していません。
クライアントのライフサイクルとベストプラクティス
基本原則
- クライアントを再利用する: クライアントはアプリケーションの起動時に一度だけ作成し、その後はアプリケーションのライフサイクル全体を通して再利用します
- 頻繁な作成を避ける: クエリやリクエストのたびに新しいクライアントを作成しないでください
- 適切にクリーンアップする: シャットダウン時には、接続プールのリソースを解放するため、必ずクライアントを閉じてください
- 可能なら共有する: 1 つのクライアントで、接続プールを通じて多数の同時実行クエリを処理できます (詳しくは下記のスレッドに関する注記を参照してください)
基本パターン
マルチスレッドアプリケーション
適切なクリーンアップ
client.close() は、クライアントが自身のプールマネージャーを所有している場合にのみ (たとえば、カスタムの TLS/プロキシ オプションを指定して作成された場合) 、クライアントを破棄し、プールされた HTTP 接続を閉じます。デフォルトの共有プールを使用している場合は、ソケットを明示的に解放するために client.close_connections() を使用してください。そうしない場合、接続はアイドル期限切れ時およびプロセス終了時に自動的に回収されます。
複数のクライアントを使用する場面
- 異なるサーバー: ClickHouse サーバーまたはクラスターごとに 1 つのクライアントを使用する
- 異なる認証情報: ユーザーやアクセスレベルごとにクライアントを分ける
- 異なるデータベース: 複数のデータベースを扱う必要がある場合
- 分離されたセッション: 一時テーブルやセッション固有の設定のために、別々のセッションが必要な場合
- スレッドごとの分離: スレッドごとに独立したセッションが必要な場合 (前述のとおり)
共通のメソッド引数
parameters 引数または settings 引数、あるいはその両方を使用します。これらのキーワード引数については以下で説明します。
Parameters 引数
query* メソッドと command メソッドでは、Python の式を ClickHouse の値式にバインドするための、省略可能な parameters キーワード引数を指定できます。バインドには 2 種類あります。
サーバーサイドバインディング
{<name>:<datatype>} 形式の式を検出すると、このモードを使用します。値は Python の辞書として渡します。
null 許容値には Python の None を使用します。ネストされた None 値は、Array および Tuple パラメータ内、ならびに dict_parameter_format が "map" に設定されている場合は Map リテラル内でサポートされます。
- Python の辞書、DateTime 値、文字列値を使用したサーバーサイドバインディング
クライアントサイドバインディング
parameters 引数には辞書またはシーケンスを指定する必要があります。クライアントサイドバインディングでは、パラメータの置換に Python の “printf” スタイル の文字列フォーマットを使用します。
サーバーサイドバインディングとは異なり、クライアントサイドバインディングは、データベース、テーブル、カラム名などのデータベース識別子には使用できない点に注意してください。Python スタイルのフォーマットでは文字列の種類の違いを区別できず、それぞれ異なる形式でフォーマットする必要があるためです (データベース識別子にはバッククォートまたは二重引用符、データ値には単一引用符を使用します) 。
- Python の Dictionary、DateTime 値、文字列のエスケープを使用した Example
- PythonのSequence (Tuple) 、Float64、IPv4Addressを使用した例
Datetime バインディングでは、naive 値を wall time として扱います。クライアントは naive 後方互換性のため、辞書パラメータ名が
datetime をそのままフォーマットします。ClickHouse は、まず {dt:DateTime('Europe/Berlin')} のようなサーバーサイドプレースホルダーで宣言されたタイムゾーン、次に設定されている場合は session_timezone、最後にサーバーのタイムゾーンを使用して解釈します。タイムゾーン対応の datetime は、プレースホルダーにタイムゾーンが指定されている場合はそのタイムゾーンに変換され、指定されていない場合は接続時に報告されたサーバーのタイムゾーンに変換されます。session_timezone 設定が報告されたサーバーのタイムゾーンと異なる場合は、タイムゾーン対応の値で意図した時点を維持するために、プレースホルダーでタイムゾーンを宣言してください。以前のホストローカル変換との一時的な互換性を確保するには、パラメータをバインドする前に common.set_setting("naive_datetime_binding", "legacy") を設定します。時点を保持するには、datetime 値をパラメータとして渡す前に、意図した tzinfo を付加してください。client.insert を介した挿入では、naive datetime 値はデフォルトでプロセスのローカルタイムゾーンで解釈されます。グローバルの naive_datetime_insert 設定を "server" にすると、カラムのタイムゾーンで wall time として解釈され、カラムにタイムゾーンがない場合はサーバーのタイムゾーンで解釈されます。Timezone-naive datetime objects を参照してください。サーバーサイドの {value:DateTime64(precision)} プレースホルダーでは、宣言された型によって、Array や Tuple のヒント内であっても秒未満の精度が自動的に保持されます。クライアントサイドの %s バインディングには宣言された型がありません。秒未満の精度で出力する必要がある場合は、datetime を DT64Param でラップしてください。_64 で終わっている場合も、クエリ内にその接尾辞付きの完全一致の名前が存在しなければ、DateTime64 フォーマットが要求されます。datetime.time または datetime.timedelta パラメータは、両方のバインディングスタイルおよび Array と Tuple の値内で、ClickHouse の Time および Time64 カラム用に [-]HH:MM:SS[.ffffff] リテラルとしてフォーマットされます。クライアントが引用符を追加するため、クエリ内でプレースホルダーを引用符で囲まないでください。timedelta は負の値にすることができ、24 時間を超えることもできます。pandas の Timedelta はナノ秒を保持し、Time64(9) では 9 桁の小数部としてフォーマットされます。タイムゾーン対応の time のタイムゾーン情報は、ClickHouse の Time にはタイムゾーンがないため無視されます。Settings 引数
settings キーワード引数を受け付けます。settings 引数には辞書を指定する必要があります。各項目は、ClickHouse の設定名とそれに対応する値で構成されます。なお、値はサーバーにクエリパラメータとして送信される際に文字列に変換されます。
クライアントレベルの settings と同様に、ClickHouse Connect は、サーバーが readonly=1 としてマークした settings を、対応するログメッセージを出力したうえで除外します。ClickHouse HTTP インターフェイス 経由のクエリにのみ適用される settings は常に有効です。これらの settings については、get_client API で説明しています。
ClickHouse settings の使用例:
クライアント command メソッド
Client.command は、表形式のデータセットを返さない文や、単一のプリミティブ値または 1 行を返すクエリに使用します。レスポンスに応じて、文字列、整数、文字列のシーケンス、または QuerySummary を返します。空の結果セットを返す読み取りでは、空文字列が返されます。
コマンドの例
DDL文
単一の値を返すシンプルなクエリ
パラメータを指定するコマンド
設定付きのコマンド
Client query メソッド
Client.query は、ClickHouse Native フォーマットの表形式データセットを取得し、QueryResult を返します。結果全体は、結果のプロパティにアクセスした時点で実体化されます。メモリに保持したくない結果には、ストリーミングメソッドを使用してください。
クエリ例
基本的なクエリ
クエリ結果へのアクセス
クライアント側パラメータを使用するクエリ
サーバー側パラメータを使用したクエリ
設定を指定したクエリ
QueryResult オブジェクト
query メソッドは、以下の公開プロパティを持つ QueryResult オブジェクトを返します。
result_rows— 行指向の結果マトリクス。result_columns— カラム指向の結果マトリクス。result_set— クエリの向きに応じて、result_rowsまたはresult_columns。column_names— 結果カラム名のタプル。column_types—ClickHouseTypeオブジェクトのタプル。row_count— 実体化された結果行数。query_id— リクエストに対して報告または生成されたクエリ ID。空文字列は、利用可能なものがなかったことを意味します。summary—X-ClickHouse-Summaryレスポンスヘッダーからデコードされた辞書。first_item— 辞書として表した最初の行。結果が空の場合はNone。first_row— シーケンスとして表した最初の行。結果が空の場合はNone。column_block_stream、row_block_stream、およびrows_stream— 内部ストリームコンテキストです。代わりに対応するクライアントのストリーミングメソッドを使用してください。
StreamContext API については、ストリーミングクエリを参照してください。
NumPy、Pandas、Arrowでクエリ結果を処理する
クライアントのストリーミングクエリメソッド
クライアント insert メソッド
Client.insert メソッドを使用します。このメソッドは次のパラメータを受け取ります。
このメソッドは
QuerySummary を返します。その summary 辞書にはサーバーから報告された値が含まれます。written_rows は簡便なプロパティで、written_bytes() と query_id() はそれぞれ対応する値を返します。挿入に失敗した場合は例外が発生します。
Pandas DataFrames、PyArrow Tables、Arrow バックエンドの DataFrames で動作する専用の挿入メソッドについては、高度な挿入 (Specialized Insert Methods) を参照してください。
A NumPy 配列は有効な Sequence of Sequences であり、メインの
insert メソッドの data 引数として使用できるため、専用メソッドは必要ありません。例
(id UInt32, name String, age UInt8) を持つ既存のテーブル users があることを前提としています。
基本的な行指向 insert
カラム指向の insert
明示的なカラム型を指定した insert
特定のデータベースにinsert
ファイルからのinsert
Raw API
Python DB-API 2.0
clickhouse_connect.dbapi モジュールは、PEP 249 で定義された接続およびカーソルのインターフェイスを実装しています。API レベル 2.0、threadsafety=2、および paramstyle="pyformat" を宣言しています。このモジュールは、PEP 249 の型コンストラクター Date、Time、Timestamp、および Binary、ならびに DateFromTicks、TimeFromTicks、および TimestampFromTicks 関数も提供します。
Cursor.execute と Cursor.executemany は、追加の settings および query_formats キーワード引数を受け付けます。settings は ClickHouse 設定を渡します。query_formats は、ステートメントが行を返す場合に、Client.query と同じマッピングを使用して、ClickHouse 型ごとに読み取りフォーマットを適用します。executemany は、実体化済みの行シーケンスを伴う互換性のある INSERT ... VALUES ステートメントに対して、ドライバーの Native 一括挿入パスを使用します。fetchone、fetchmany、および fetchall は、現在の実体化済みの結果を消費します。
Cursor.description は、各結果カラムの型から null_ok を導出します。null 非許容型は False を返し、Nullable ラッパー、Variant、および Dynamic を含む null 許容型は True を返します。None は null 許容性が不明であることを意味します。先頭のコメントを無視して SELECT または WITH で始まるクエリが、行もカラムメタデータも返さない場合、カーソルは description を設定するために LIMIT 0 メタデータクエリを実行します。そのメタデータクエリが失敗した場合、description は空のままになります。
ClickHouse は、この HTTP インターフェイス経由では従来型のトランザクションを提供しません。Connection.commit() と Connection.rollback() は no-op です。接続が共有される場合でも、セッション ID の同時実行ルール は引き続き適用されます。
ユーティリティクラスと関数
clickhouse_connect.__version__ として公開されています。
Exceptions
clickhouse_connect.driver.exceptions で定義されています。DatabaseError と OperationalError では、ClickHouse のエラーコードを表す数値の code 属性と、UNKNOWN_TABLE のようなシンボリック名を表す name 属性が公開されているため、アプリケーションはメッセージをパースする代わりに exc.code に基づいて分岐できます。code は show_clickhouse_errors が無効でも設定されますが、name を取得するにはエラーの詳細情報 (True または "scrub") が必要です。どちらも、トランスポートエラーなどで利用できない場合は None になります。エンドユーザーにホストやサーバーバージョンの情報を含めずに SQL エラーを表示する場合は、show_clickhouse_errors="scrub" を使用してください。この設定は、ストリーム途中の StreamFailureError メッセージおよび汎用トランスポートメッセージも制御します。制御対象は str(exc) のみです。トランスポートエラーは引き続き __cause__ として関連付けられ、トレースバックには元のホスト、URL、またはライブラリのエラーテキストが含まれる場合があります。
ClickHouse SQL ユーティリティ
clickhouse_connect.driver.binding モジュールの関数と DT64Param クラスを使用すると、ClickHouse SQL クエリを適切に構築し、エスケープできます。同様に、clickhouse_connect.driver.parser モジュールの関数を使用すると、ClickHouse のデータ型名をパースできます。