Maison > développement back-end > Golang > 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
Libérer: 2024-10-25 17:22:38
original
980 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal