Maison  >  Article  >  développement back-end  >  Pourquoi ma requête de base de données Go avec une clause IN échoue-t-elle lors de l'utilisation d'une tranche d'entiers ?

Pourquoi ma requête de base de données Go avec une clause IN échoue-t-elle lors de l'utilisation d'une tranche d'entiers ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-25 17:22:38855parcourir

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

L'énigme des clauses IN de base de données dans Go

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn