ClickHouse Connectを使ったデータの挿入: 高度な使い方
InsertContexts
insert および insert_df メソッドを、InsertContext 内で実行します。insert_arrow、insert_df_arrow、raw_insert の各メソッドはペイロードを直接送信するため、これを使用しません。InsertContext には、クライアントの insert メソッドに引数として渡すすべての値が含まれます。さらに、InsertContext の初回作成時には、効率的な Native format での挿入に必要な対象カラムのデータ型を ClickHouse Connect が取得します。複数回の挿入で InsertContext を再利用すると、この”事前クエリ”を省略できるため、挿入をより高速かつ効率的に実行できます。
InsertContext は、クライアントの create_insert_context メソッドを使って取得できます。このメソッドは、context 自体を除き、insert 関数と同じ引数を受け取ります。再利用時に変更すべきなのは、InsertContext の data プロパティだけである点に注意してください。これは、同じテーブルに新しいデータを繰り返し挿入するための再利用可能なオブジェクトを提供するという、本来の目的に沿ったものです。
InsertContextには、挿入処理中に更新される可変状態が含まれているため、スレッドセーフではありません。
書き込みフォーマット
DateTime カラムの最初の値が整数であれば、クライアントはそれをエポック秒として扱います。
通常、書き込みフォーマットを上書きする必要はありませんが、clickhouse_connect.datatypes.format のメソッドを使うとグローバルに設定できます。Array、Nullable、LowCardinality などのコンテナーラッパーは、要素型のフォーマット動作を保持します。
書き込みフォーマットのオプション
専用の 挿入 メソッド
insert_df— Pandas DataFrame をカラム指向の Native データとして 挿入 します。明示的なカラム名 / 型、または再利用可能なInsertContextもサポートします。insert_arrow— ClickHouse の Arrow input format を使用して PyArrow Table を 挿入 します。insert_df_arrow— Arrow ベースの Pandas DataFrame または Polars DataFrame を 挿入 します。Pandas のカラムはすべて Arrow ベースの dtype を使用している必要があります。
database、settings、およびリクエストごとの HTTP transport_settings を受け付けます。
NumPy 配列は有効な Sequence の Sequence であり、メインの
insert メソッドの data 引数として使用できるため、専用メソッドは必要ありません。Pandas DataFrame の挿入
PyArrow Table を使った挿入
ArrowベースのDataFrame挿入 (pandas 2.x)
PyArrow スキーマからテーブルを作成する
create_table_from_arrow_schema は、一般的なスカラー Arrow フィールドから CREATE TABLE ステートメントを生成します。このマッピングは、符号付き整数、符号なし整数、浮動小数点値、ブール値、文字列、日付、タイムスタンプをカバーします。意図的に NULL を許容しない ClickHouse カラムを作成し、サポートされていない Arrow 型に対しては TypeError を送出するため、実行前に生成された DDL を確認してください。
タイムゾーン
datetime オブジェクトを DateTime または DateTime64 カラムに挿入する際、ClickHouse Connect はそれらを epoch 値に変換します。
タイムゾーン対応の datetime オブジェクト
ClickHouse Connect は標準ライブラリの
zoneinfo モジュールを使用します。ドライバーは pytz に依存しなくなっています。タイムゾーン情報を持たない datetime オブジェクト
naive_datetime_insert は、タイムゾーン情報を持たない datetime 値をネイティブ Python オブジェクトとして挿入する際の動作を制御します。また、DateTime64 カラムで受け付けられるタイムゾーン情報を持たない ISO 文字列にも適用されます。
"local"は 1.x でのデフォルトです。Python は.timestamp()の呼び出し時に、プロセスのタイムゾーンで値を解釈します。これにより既存の動作が維持されます。"server"は、値をDateTimeまたはDateTime64カラムで宣言されたタイムゾーンの実時間として解釈します。カラムにタイムゾーンが指定されていない場合は、クライアント接続時に取得したサーバーのタイムゾーンを使用します。
datetime オブジェクトまたは DateTime64 ISO 文字列を含むネイティブ挿入の各カラムをシリアル化する際に読み取られるため、変更は既存のクライアントおよび再利用可能な挿入コンテキストにも適用されます。
"server" では、ClickHouse Connect は値をエポックに変換する前に、対象の tzinfo を付与します。IANA タイムゾーンでは、夏時間切り替えに関する標準ライブラリの規則に従います。秋の重複時間では、datetime の fold 値が使用されます。デフォルトの fold=0 は切り替え前のオフセットを選択し、fold=1 は切り替え後のオフセットを選択します。春のギャップでも同じオフセット選択が使用され、拒否や正規化は行われません。
春のギャップにある存在しない実時間は、ClickHouse のテキストパースで別のオフセットが選択される可能性があるため、実時間モードのクエリパラメータを介してラウンドトリップできない場合があります。時点が重要な場合は、タイムゾーン対応の datetime または有効な実時間を使用してください。
このオプションは、datetime 値をネイティブ Python オブジェクトとして insert する場合と、DateTime64 が受け付けるタイムゾーン情報のない ISO 文字列にのみ適用されます。タイムゾーン情報のない datetime64 dtype の NumPy および Pandas カラムでは、既存の UTC 実時間変換が維持されます。
どちらのモードにも依存せずに特定の時点を表すには、意図したタイムゾーンを付与するか、エポック整数を明示的に指定してください。
datetime のクエリパラメータには、個別の naive_datetime_binding 設定が使用されます。デフォルトの "wall" モードでは、ホストのローカル時刻への変換を行わずに日時フィールドが送信されます。Parameters argument セクションを参照してください。
タイムゾーン メタデータを持つ DateTime カラム
DateTime('America/Denver') や DateTime64(3, 'Asia/Tokyo') のようにタイムゾーン メタデータを宣言できます。このメタデータは、クエリ時に値がどのように表示されるかを制御します。
タイムゾーン対応の値を挿入する際、ClickHouse Connect はその値が表す時点を保持します。タイムゾーン情報のない値の場合、naive_datetime_insert 設定によってプロセスのタイムゾーンとカラムのタイムゾーンのどちらを使用するかが決まります。クエリ時には、column_tzs 引数でカラムごとの上書きを指定しない限り、結果にはそのカラムのタイムゾーンが使用されます。query_tz 引数では、カラムに宣言されたタイムゾーンは上書きされません。
ファイルの挿入
clickhouse_connect.driver.tools.insert_file はローカルファイルを既存のテーブルにストリームで挿入し、パースは ClickHouse に委ねます。
input_format_allow_errors_ratio や input_format_allow_errors_num などの入力フォーマット設定は、settings 経由で渡せます。
AsyncClient の場合は、同じ引数を使って insert_file_async を await します:
raw_insert を await する前にワーカースレッドでファイルを読み込むため、ファイルの内容はメモリ上に保持されます。