Go でスライスを使用した IN 句を使用したデータベースのクエリ
データベースのクエリでは、次を使用して値のサブセットに基づいて結果をフィルタリングするのが一般的です。 IN 句。ただし、Go で整数のスライスを操作する場合、構文的に有効で慣用的な IN 句を作成するのは難しい場合があります。
結合された 2 つのテーブルから個別のタイトルを取得しようとする次のクエリを考えてみましょう。 IN 句には、artIds:
<code class="go">inq := "6,7" //strings.Join(artIds, ",") rows, err = db.Query("SELECT DISTINCT title FROM tags_for_articles LEFT JOIN tags ON tags.id = tags_for_articles.tag_id WHERE article_id IN (?)", inq)</code>
という名前のスライスの内容が設定されます。簡潔にするために、エラー処理は省略されています。データベース/SQL がドライバーに引数を直接渡すため、クエリは失敗します。ドライバーは、スライスの長さに応じて可変数のバインド変数を期待します。
代わりに、静的 IN 句を使用するクエリは正常に実行されます。
<code class="go">rows, err = db.Query("SELECT DISTINCT title FROM tags_for_articles LEFT JOIN tags ON tags.id = tags_for_articles.tag_id WHERE article_id IN (6,7)", inq)</code>
この問題に対する 1 つの解決策は、データベース クエリをより詳細に制御できる sqlx ライブラリを使用することです。 sqlx.In 関数を使用すると、IN 句を含むクエリを処理し、必要なバインド変数を動的に作成できます。
<code class="go">var levels = []int{4, 6, 7} query, args, err := sqlx.In("SELECT * FROM users WHERE level IN (?);", levels)</code>
結果のクエリと引数を使用して、プリペアド ステートメントを実行できます。 sqlx.In 関数を使用すると、クエリが構文的に有効であり、指定された値のスライスを使用して効率的に実行できることが保証されます。
以上がGo でスライスを使用して IN 句を含むデータベースにクエリを実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。