Les requêtes de base de données avec des clauses IN sont une nécessité courante, mais leur implémentation dans Go a laissé de nombreux développeurs perplexes. Lorsque vous tentez d'exécuter une requête en utilisant une tranche d'entiers comme paramètre de clause IN, certaines solutions peuvent sembler contre-intuitives.
Dans l'exemple fourni, la requête échoue lors de l'utilisation d'une représentation sous forme de chaîne de la tranche comme argument pour le Clause 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>
Cependant, cette approche réussit :
<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>
La raison de cet écart réside dans le comportement du package base de données/sql. Il n'inspecte pas la requête et transmet les arguments directement au pilote de base de données. Par conséquent, le bindvar (?) dans la requête correspond à un seul argument, et non à un nombre variable d'arguments comme souhaité.
<code class="go">var levels = []int{4, 6, 7} rows, err := db.Query("SELECT * FROM users WHERE level IN (?);", levels)</code>
Heureusement, le package sqlx fournit une solution plus élégante à ce problème. En utilisant sqlx.In, on peut traiter la requête avant son exécution :
<code class="go">query, args, err := sqlx.In("SELECT * FROM users WHERE level IN (?);", levels)</code>
Pour des conseils plus complets, reportez-vous à la documentation Godoc sur InQueries.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!