SQLAlchemy サポート
ClickHouse Connect には、コアドライバ上に実装された SQLAlchemy ダイアレクト(clickhousedb)が含まれています。これは SQLAlchemy Core API を対象としており、SQLAlchemy 1.4.40 以降および 2.0.x をサポートします。
SQLAlchemy で接続する
clickhousedb:// または clickhousedb+connect:// のいずれかの URL を指定してエンジンを作成します。クエリパラメータは、ClickHouse の設定、クライアントオプション、および HTTP/TLS トランスポートオプションに対応します。
URL/クエリパラメータに関する注意:
- ClickHouse の設定: クエリパラメータとして指定します(例:
use_skip_indexes=0)。 - クライアントオプション:
compression(compressのエイリアス)、query_limit、タイムアウトなど。 - HTTP/TLS オプション: HTTP プールおよび TLS 用のオプション(例:
ch_http_max_field_name_size=99999、ca_cert=certifi)。
サポートされているオプションの全一覧については、以下のセクションにある Connection arguments and Settings を参照してください。これらは SQLAlchemy の DSN で指定することもできます。
コアクエリ
このダイアレクトは、結合、フィルタリング、並べ替え、LIMIT/OFFSET、DISTINCT を伴う SQLAlchemy Core の SELECT クエリをサポートします。
WHERE 句の指定が必須の軽量な DELETE がサポートされています。
DDL とリフレクション
提供されている DDL ヘルパーと型/エンジンの構成要素を使用して、データベースおよびテーブルを作成できます。テーブルのリフレクション(カラム型やエンジンを含む)にも対応しています。
反映された列には、サーバー上に存在する場合、clickhousedb_default_type、clickhousedb_codec_expression、clickhousedb_ttl_expression などのダイアレクト固有の属性が含まれます。
INSERT(Core と基本的な ORM)
INSERT は、SQLAlchemy Core 経由だけでなく、利便性のためにシンプルな ORM モデルを使っても実行できます。
対象範囲と制限事項
- 主な対象範囲:
SELECTとJOIN(INNER、LEFT OUTER、FULL OUTER、CROSS)、WHERE、ORDER BY、LIMIT/OFFSET、DISTINCTなどの SQLAlchemy Core 機能を利用できるようにすること。 WHERE付きのDELETEのみ: このダイアレクトは軽量なDELETE操作をサポートしますが、テーブル全体を誤って削除することを避けるため、明示的なWHERE句が必須です。テーブルを空にするにはTRUNCATE TABLEを使用してください。UPDATEは非対応: ClickHouse は追記最適化されています。このダイアレクトはUPDATEを実装していません。データを変更する必要がある場合は、上流で変換を適用して再挿入するか、自己責任で明示的なテキスト SQL(例:ALTER TABLE ... UPDATE)を使用してください。- DDL とリフレクション: データベースおよびテーブルの作成はサポートされており、リフレクションによりカラム型とテーブルエンジンのメタデータが返されます。ClickHouse はこれらの制約を強制しないため、従来型の PK/FK/インデックスのメタデータは存在しません。
- ORM の対象範囲: 宣言的モデルおよび
Session.add(...)/bulk_save_objects(...)による挿入は、利便性のために動作します。高度な ORM 機能(リレーション管理、Unit of Work ベースの更新、カスケード、Eager/Lazy ローディングのセマンティクス)はサポートされません。 - プライマリキーのセマンティクス:
Column(..., primary_key=True)は、SQLAlchemy がオブジェクト識別子を管理するためだけに使用されます。ClickHouse 上でサーバーサイド制約が作成されるわけではありません。ORDER BY(および任意のPRIMARY KEY)はテーブルエンジン(例:MergeTree(order_by=...))を通じて定義してください。 - トランザクションとサーバー機能: 二相トランザクション、シーケンス、
RETURNING、高度な分離レベルはサポートされません。engine.begin()はステートメントをまとめるための Python のコンテキストマネージャーを提供しますが、実際のトランザクション制御は行いません(commit/rollback は実際には何も行いません)。