Maison >développement back-end >Golang >Comment exécuter une requête de base de données Go avec une tranche dans la clause IN ?
Question :
Pourquoi la requête de base de données Golang suivante l'utilisation d'une tranche d'entiers dans la clause IN échoue :
<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>
Réponse :
Le problème survient car le package base de données/sql utilisé pour l'interrogation n'inspecte pas le requête et transmet les arguments directement au pilote de base de données. Cela rend difficile la gestion des requêtes avec des clauses IN contenant un nombre variable d'arguments.
Dans la requête fournie, le ? La variable bind correspond à un seul argument, alors que l’utilisation prévue est de lier plusieurs arguments en fonction de la longueur des artIds de tranche. Cependant, le pilote n'est pas en mesure de gérer cela correctement.
Pour résoudre ce problème, il est recommandé d'utiliser le package sqlx, qui offre un meilleur contrôle sur les requêtes de base de données.
Solution utilisant le package sqlx :
<code class="go">var artIds = []int{6, 7} query, args, err := sqlx.In("SELECT DISTINCT title FROM tags_for_articles LEFT JOIN tags ON tags.id = tags_for_articles.tag_id WHERE article_id IN (?);", artIds)</code>
La fonction sqlx.In traite la requête et génère les variables de liaison appropriées pour la tranche d'ints, permettant à la requête d'être exécutée avec succès.
Pour plus d'informations sur ce sujet, reportez-vous à la documentation Godoc pour 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!