接続
conn 変数は作成済みで利用可能であると仮定します。
実行
Exec メソッドで実行できます。これは、DDL や単純なステートメントに適しています。大規模な insert やクエリの反復処理には使用しないでください。
バッチ挿入
Send() メソッドで送信します。バッチは、Send が実行されるまでメモリ上に保持されます。
接続リークを防ぐため、バッチに対して Close を呼び出すことを推奨します。これは、バッチの準備後に defer キーワードを使って行えます。これにより、Send が一度も呼び出されなかった場合でも接続がクリーンアップされます。行が 1 つも追加されなかった場合、クエリログに 0 行の insert が記録される点に注意してください。
エフェメラルカラム
行のクエリ
QueryRow メソッドを使って単一の行をクエリすることも、Query で結果セットを反復処理するためのカーソルを取得することもできます。前者では読み出したデータの格納先となる宛先を渡せますが、後者では各行に対して Scan を呼び出す必要があります。
SELECT ステートメントで指定した順序どおりに渡す必要があります。上記のように SELECT * を使用した場合は、デフォルトでカラム宣言順が使われます。
挿入時と同様に、Scan メソッドでも対象の変数には適切な型が必要です。ここでも柔軟性を重視しており、精度が失われない場合は可能な範囲で型変換が行われます。たとえば、上記の例では UUID カラムを string 型の変数に読み込んでいます。各カラム型でサポートされる Go の型の一覧については、型変換 を参照してください。
最後に、Query メソッドと QueryRow メソッドには Context を渡せる点にも注意してください。これはクエリレベルの設定に使用できます。詳細は Using Context を参照してください。
非同期 INSERT
列指向での挿入
構造体の利用
serialize を使用する Select
struct へのスキャン
ScanStruct を使用すると、クエリの単一の行を struct にマーシャリングできます。
struct の追加
AppendStruct を使用すると、既存のバッチに struct を追加し、それを完全な1行として解釈できます。これには、struct のカラム名と型がテーブルと一致している必要があります。すべてのカラムに対応する struct フィールドが必要ですが、一部の struct フィールドには対応するカラムがなくてもかまいません。その場合は単に無視されます。
パラメータバインド
Exec、Query、QueryRow の各メソッドでパラメータバインドをサポートしています。以下の例に示すように、名前付きパラメータ、番号付きパラメータ、位置指定パラメータを利用できます。それぞれの例を以下に示します。
特殊なケース
[ ] で囲まれた値のセットを挿入する必要がある場合は、ArraySet を使用します。
グループ/タプルが必要な場合は、たとえば IN 演算子で使うような ( ) で囲まれた値には、GroupSet を使用できます。これは、以下の例のように複数のグループが必要な場合に特に便利です。
最後に、DateTime64 フィールドでは、パラメータが適切にレンダリングされるよう、精度の指定が必要です。ただし、フィールドの精度レベルはクライアント側では分からないため、ユーザーが指定する必要があります。これを簡単にするために、DateNamed パラメータを用意しています。
コンテキストの使用
context.Background() を使用していましたが、この仕組みを使えば、設定や期限を渡したり、クエリをキャンセルしたりできます。
withDeadline で作成した コンテキスト を渡すと、クエリの実行時間に上限を設定できます。これは絶対時刻であり、期限が切れても行われるのは connection の解放と ClickHouse へのキャンセルシグナル送信だけである点に注意してください。代わりに WithCancel を使って、クエリを明示的にキャンセルすることもできます。
ヘルパーの clickhouse.WithQueryID と clickhouse.WithQuotaKey を使うと、クエリ ID とクォータキーを指定できます。クエリ ID は、ログでクエリを追跡したり、キャンセルしたりする際に役立ちます。クォータキーは、一意のキー値に基づいて ClickHouse の使用量に制限を課すために使用できます。詳しくは Quotas Management を参照してください。
また、Connection Settings に示されているように connection 全体に適用するのではなく、特定のクエリに対してのみ設定が適用されるように、コンテキスト を使うこともできます。
最後に、clickhouse.WithBlockSize を使ってブロックバッファのサイズを制御できます。これは connection レベルの設定 BlockBufferSize を上書きし、任意の時点でデコードされてメモリ上に保持されるブロックの最大数を制御します。値を大きくすると、メモリ使用量との引き換えに、より高い並列化が期待できます。
上記の例を以下に示します。
Progress、profile、log 情報
動的スキャン
外部テーブル
SELECT クエリとともにデータを ClickHouse に送信できます。このデータは一時テーブルに格納され、クエリの評価時にクエリ内で利用できます。
クエリとともにクライアントから外部データを送信するには、ユーザーはまず ext.NewTable で外部テーブルを作成し、その後それを コンテキスト 経由で渡す必要があります。
OpenTelemetry
clickhouse.WithSpan を使用すると、コンテキスト経由でスパンをクエリに関連付けることができます。
HTTP トランスポートの制限ClickHouse server は標準の
traceparent / tracestate HTTP ヘッダーを受け付けますが、clickhouse-go の HTTP トランスポートは現在それらを送信しないため、HTTP では WithSpan は効果がありません。回避策として、接続オプションの HttpHeaders を使ってヘッダーを手動で設定できます。