メインコンテンツへスキップ

ClickHouse Connectを使ったデータの挿入: 高度な使い方

InsertContexts

ClickHouse Connect は、すべての挿入を InsertContext 内で実行します。InsertContext には、クライアントの insert メソッドに引数として渡すすべての値が含まれます。さらに、InsertContext の初回作成時には、効率的な Native format での挿入に必要な対象カラムのデータ型を ClickHouse Connect が取得します。複数回の挿入で InsertContext を再利用すると、この”事前クエリ”を省略できるため、挿入をより高速かつ効率的に実行できます。 InsertContext は、クライアントの create_insert_context メソッドを使って取得できます。このメソッドは、insert 関数と同じ引数を受け取ります。再利用時に変更すべきなのは、InsertContextdata プロパティだけである点に注意してください。これは、同じテーブルに新しいデータを繰り返し挿入するための再利用可能なオブジェクトを提供するという、本来の目的に沿ったものです。
InsertContextには、挿入処理中に更新される可変状態が含まれているため、スレッドセーフではありません。

書き込みフォーマット

現在、書き込みフォーマットが実装されている型は限られています。ほとんどの場合、ClickHouse Connect は最初の (NULL ではない) データ値の型を確認し、そのカラムに適した書き込みフォーマットを自動的に判定します。たとえば、DateTime カラムに挿入する際、そのカラムの最初の挿入値が Python の整数であれば、ClickHouse Connect はそれをエポック秒とみなし、その整数値を直接挿入します。 ほとんどの場合、データ型の書き込みフォーマットをオーバーライドする必要はありませんが、グローバルレベルで変更したい場合は、clickhouse_connect.datatypes.format パッケージ内の関連メソッドを使用できます。

書き込みフォーマットのオプション

専用の 挿入 メソッド

ClickHouse Connect では、一般的なデータフォーマット向けに専用の 挿入 メソッドが用意されています。
  • insert_df — Pandas DataFrame を 挿入 します。Python の Sequence の Sequence である data 引数の代わりに、このメソッドの 2 番目のパラメータには、Pandas DataFrame インスタンスである必要がある df 引数を指定します。ClickHouse Connect は DataFrame をカラム指向のデータソースとして自動的に処理するため、column_oriented パラメータは不要で、使用することもできません。
  • insert_arrow — PyArrow Table を 挿入 します。ClickHouse Connect は Arrow table を変更せず、そのまま ClickHouse サーバー に渡して処理するため、tablearrow_table に加えて使用できる引数は databasesettings のみです。
  • insert_df_arrow — Arrow ベースの Pandas DataFrame または Polars DataFrame を 挿入 します。ClickHouse Connect は、その DataFrame が Pandas 型か Polars 型かを自動的に判別します。Pandas の場合は、各カラムの dtype backend が Arrow ベースであることを確認する検証が行われ、そうでないカラムがあるとエラーになります。
NumPy 配列は有効な Sequence の Sequence であり、メインの insert メソッドの data 引数として使用できるため、専用メソッドは必要ありません。

Pandas DataFrame の挿入

PyArrow Table を使った挿入

ArrowベースのDataFrame挿入 (pandas 2.x)

タイムゾーン

Python の datetime.datetime オブジェクトを ClickHouse の DateTime または DateTime64 カラムに挿入する際、ClickHouse Connect はタイムゾーン情報を自動的に処理します。ClickHouse では、すべての DateTime 値が内部的にタイムゾーンを持たない Unix timestamp (epoch からの秒、またはその小数秒) として保存されるため、挿入時のタイムゾーン変換はクライアント側で自動的に行われます。

タイムゾーン情報を持つ datetime オブジェクト

タイムゾーン対応の Python の datetime.datetime オブジェクトを挿入すると、ClickHouse Connect は自動的に .timestamp() を呼び出して Unix timestamp に変換し、タイムゾーンのオフセットを正しく反映します。つまり、どのタイムゾーンの datetime オブジェクトでも挿入でき、UTC 相当のタイムスタンプとして正しく保存されます。
この例では、3 つの datetime オブジェクトはそれぞれ異なる timezone を持つため、表す時点も異なります。各オブジェクトは対応する Unix timestamp に正しく変換され、ClickHouse に保存されます。
pytz を使用する場合、naive な datetime に timezone 情報を付与するには、localize() メソッドを使用する必要があります。tzinfo= を datetime コンストラクターに直接渡すと、過去のオフセットが誤って使われます。UTC については、tzinfo=pytz.UTC は正しく機能します。詳しくは pytz docs を参照してください。

タイムゾーン情報を持たない datetime オブジェクト

タイムゾーン情報を持たない Python の datetime.datetime オブジェクト (tzinfo がないもの) を挿入すると、.timestamp() メソッドはそれをシステムのローカルタイムゾーンの日時として解釈します。曖昧さを避けるため、以下を推奨します。
  1. 挿入時は常にタイムゾーン対応の datetime オブジェクトを使用する、または
  2. システムのタイムゾーンが UTC に設定されていることを確認する、または
  3. 挿入前に手動でエポックタイムスタンプへ変換する

タイムゾーンメタデータを持つDateTimeカラム

ClickHouseのカラムは、タイムゾーンメタデータを指定して定義できます (例: DateTime('America/Denver') または DateTime64(3, 'Asia/Tokyo')) 。このメタデータはデータの保存方法には影響せず (引き続きUTCのタイムスタンプとして保存されます) 、ClickHouseからデータをクエリして取得する際に使用されるタイムゾーンを制御します。 このようなカラムに挿入する際、ClickHouse ConnectはPythonのdatetimeをUnixタイムスタンプに変換します (タイムゾーンがある場合はそれを考慮します) 。データをクエリして取得すると、ClickHouse Connectは、挿入時にどのタイムゾーンを使ったかにかかわらず、そのdatetimeをカラムのタイムゾーンに変換して返します。

ファイルの 挿入

clickhouse_connect.driver.tools パッケージには insert_file メソッドが含まれており、ファイルシステムから既存の ClickHouseテーブルへ直接データを 挿入 できます。パースは ClickHouseサーバーに委譲されます。insert_file は次のパラメーターを受け取ります。 データに不整合があるファイルや、日付/時刻の値が通常とは異なる形式のファイルでは、データ取り込みに適用される settings (input_format_allow_errors_numinput_format_allow_errors_num など) も、このメソッドで使用できます。
最終更新日 2026年7月2日