database/sql (または「標準」API) を使用すると、標準インターフェイスに準拠することで、アプリケーションコードを基盤となるデータベースに依存させたくないケースでもこのクライアントを利用できます。その代わりに、抽象化や間接化のレイヤーが増え、ClickHouse とは必ずしも整合しないプリミティブも含まれます。ただし、ツールが複数のデータベースに接続する必要がある場面では、こうしたコストは通常許容できます。
また、このクライアントはトランスポート層として HTTP もサポートしています。この場合でも、最適なパフォーマンスを得るためにデータはネイティブフォーマットでエンコードされます。
接続
clickhouse://<host>:<port>?<query_option>=<value> 形式の DSN 文字列と Open メソッドを使用する方法、または clickhouse.OpenDB メソッドを使用する方法のいずれかで確立できます。後者は database/sql の仕様には含まれていませんが、sql.DB インスタンスを返します。このメソッドでは profiling などの機能を利用できますが、これらを database/sql の仕様を通じて公開する明確な手段はありません。
conn 変数は作成済みで使用可能であるものとします。
接続設定
hosts- 負荷分散とフェイルオーバーのための、単一アドレスのホストをカンマ区切りで指定したリスト - 複数のノードへの接続 を参照してください。username/password- 認証情報 - Authentication を参照してくださいdatabase- 現在のデフォルト database を選択しますdial_timeout- duration 文字列は、符号付きの場合もある 10 進数の数値を並べたもので、各値には必要に応じて小数部と、300ms、1sのような単位の接尾辞を付けられます。有効な時間単位はms、s、mです。connection_open_strategy-random/in_order(デフォルトはrandom) - 複数のノードへの接続 を参照してくださいround_robin- 一連の server からラウンドロビンで選択しますin_order- 指定された順序で、最初に稼働中の server が選択されます
debug- デバッグ出力を有効にします (ブール値)compress- 圧縮アルゴリズムを指定します -none(デフォルト) 、zstd、lz4、gzip、deflate、br。trueに設定するとlz4が使用されます。ネイティブ通信でサポートされるのはlz4とzstdのみです。compress_level- 圧縮レベル (デフォルトは0) です。圧縮 を参照してください。これはアルゴリズムごとに異なります。gzip--2(最高速) から9(最高圧縮)deflate--2(最高速) から9(最高圧縮)br-0(最高速) から11(最高圧縮)zstd、lz4- 無視されます
secure- セキュアな SSL 接続を確立します (デフォルトはfalse)skip_verify- 証明書の検証をスキップします (デフォルトはfalse)block_buffer_size- block バッファサイズを制御できます。BlockBufferSizeを参照してください。 (デフォルトは2)
HTTP 経由で接続する
セッション
HTTP のみセッションが必要なのは、HTTP トランスポートを使用する場合のみです。native TCP connection には、セッションが自動的に組み込まれています。
session_id を設定として渡すことで、一時テーブルなどのセッションに紐づく機能を有効にできます。
実行
sql ステートメントを実行できます。
ExecContext を使用してください。詳しくは コンテキストの使用 を参照してください。
バッチ挿入
Being メソッドで sql.Tx を作成することで実現できます。これを基に、INSERT ステートメントを指定して Prepare メソッドを使うと、バッチを取得できます。これにより sql.Stmt が返され、Exec メソッドを使ってそこに行を追加できます。元の sql.Tx に対して Commit が実行されるまで、バッチはメモリ上に蓄積されます。
行をクエリする
QueryRow メソッドを使用します。これは *sql.Row を返し、このオブジェクトに対して Scan を呼び出すことで、カラムの値を格納する変数へのポインタを渡せます。QueryRowContext バリアントを使うと、background 以外のコンテキストを渡せます。詳しくは コンテキストの使用 を参照してください。
Query メソッドを使用します。これは *sql.Rows 構造体を返し、Next を呼び出して各行を順に処理できます。これに相当する QueryContext では、コンテキストを渡せます。
非同期 INSERT
ExecContext メソッドで INSERT を実行することで行えます。以下のように、非同期モードを有効にしたコンテキストを渡す必要があります。これにより、クライアントがサーバーでの INSERT 完了まで待機するか、データを受信した時点で応答するかをユーザーが指定できます。これは実質的に、パラメーター wait_for_async_insert を制御します。
パラメータバインディング
Exec、Query、QueryRow メソッド (およびそれらに対応する Context バリアント) にパラメータを渡せます。位置指定、名前付き、番号付きのパラメータをサポートしています。
コンテキストの使用
Context バリアントを使って実現します。つまり、デフォルトでバックグラウンドコンテキストを使用する Exec のようなメソッドには、先頭のパラメーターとしてコンテキストを渡せる ExecContext というバリアントがあります。これにより、アプリケーションフローのどの段階でもコンテキストを渡せます。たとえば、ConnContext を使って接続を確立するときや、QueryRowContext を使ってクエリの行を取得するときにコンテキストを渡せます。利用可能なすべてのメソッドの例を以下に示します。
コンテキストを使ってデッドライン、キャンセルシグナル、クエリ ID、クォータキー、接続設定を渡す方法の詳細については、ClickHouse API の コンテキストの使用 を参照してください。
動的スキャン
外部テーブル
SELECT クエリとともに ClickHouse にデータを送信できます。このデータは一時テーブルに格納され、評価のためにクエリ内で使用できます。
クエリとともに外部データを送信するには、ユーザーは ext.NewTable を使用して外部テーブルを作成し、それを Context 経由で渡す前に構築する必要があります。
OpenTelemetry
clickhouse.WithSpan を使用すると、context 経由でクエリに span を関連付けることができます。
HTTP トランスポートの制限ClickHouse server は標準の
traceparent / tracestate HTTP ヘッダーを受け付けますが、clickhouse-go の HTTP トランスポートは現在これらを送信しないため、HTTP では WithSpan は効果がありません。回避策として、接続オプションの HttpHeaders でヘッダーを手動で設定できます。圧縮
lz4 および zstd による圧縮をサポートしています。さらに、HTTP 接続では gzip、deflate、br による圧縮もサポートされています。これらのいずれかを有効にすると、挿入時およびクエリ応答時にブロック単位で圧縮が行われます。その他のリクエスト、たとえば ping やクエリリクエストは、非圧縮のままです。これは lz4 および zstd のオプションと同様の動作です。
接続の確立に OpenDB メソッドを使用する場合は、Compression 設定を渡せます。これには、圧縮レベルを指定する機能も含まれます (以下を参照) 。DSN を使用して sql.Open で接続する場合は、compress パラメータを使用します。これは、gzip、deflate、br、zstd、lz4 のいずれかの圧縮アルゴリズム、またはブールフラグを指定できます。true に設定した場合は、lz4 が使用されます。デフォルトは none、つまり圧縮は無効です。
compress_level または Compression オプションの Level フィールドで指定できます。既定値は 0 ですが、アルゴリズムによって異なります。
gzip--2(最速) ~9(最高圧縮)deflate--2(最速) ~9(最高圧縮)br-0(最速) ~11(最高圧縮)zstd,lz4- 無視されます