IN 句を含むデータベース クエリは一般的に必要なものですが、Go での実装は多くの開発者を困惑させています。 IN 句パラメータとして整数のスライスを使用してクエリを実行しようとすると、一部の解決策は直感に反するように見えるかもしれません。
提供された例では、スライスの文字列表現を引数として使用すると、クエリは失敗します。 IN 句:
<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>
ただし、このアプローチは成功します:
<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>
この矛盾の理由は、データベース/SQL パッケージの動作にあります。クエリは検査されず、引数をデータベース ドライバーに直接渡します。したがって、クエリ内のバインド変数 (?) は、必要な可変数の引数ではなく、単一の引数に対応します。
<code class="go">var levels = []int{4, 6, 7} rows, err := db.Query("SELECT * FROM users WHERE level IN (?);", levels)</code>
幸いなことに、sqlx パッケージは、この問題に対してより適切な解決策を提供します。 sqlx.In を使用すると、実行前にクエリを処理できます。
<code class="go">query, args, err := sqlx.In("SELECT * FROM users WHERE level IN (?);", levels)</code>
より包括的なガイダンスについては、InQueries に関する Godoc ドキュメントを参照してください。
以上が整数のスライスを使用すると、IN 句を含む Go データベース クエリが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。