ホームページ  >  記事  >  バックエンド開発  >  整数のスライスを使用すると、IN 句を含む Go データベース クエリが失敗するのはなぜですか?

整数のスライスを使用すると、IN 句を含む Go データベース クエリが失敗するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-25 17:22:38855ブラウズ

Why Does My Go Database Query with an IN Clause Fail When Using a Slice of Integers?

Go におけるデータベース IN 句の謎

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。