Exécution de "SELECT ... WHERE ... IN ..." à l'aide de MySQLdb
Malgré une exécution réussie des requêtes SQL de la ligne de commande MySQL, vous pouvez rencontrer des problèmes lors de l'exécution de requêtes avec la syntaxe "WHERE ... IN ..." depuis Python à l'aide de MySQLdb. Examinons le problème et explorons une solution.
Dans votre cas, vous ne parvenez pas à récupérer des lignes avec une requête qui filtre la colonne "bar" avec une clause "IN", alors qu'une requête similaire qui filtre le " fooid" avec "IN" réussit. Cette incohérence peut être attribuée à la façon dont MySQLdb gère les requêtes paramétrées.
Lorsque vous spécifiez un tableau de valeurs comme argument à MySQLdb, il le convertit automatiquement en un tuple de chaînes avec des guillemets simples, ce qui entraîne une syntaxe incorrecte pour la clause "IN". Par exemple, votre code convertit ['A','C'] en ("'A'","'C'").
args=[['A','C']]
Pour résoudre ce problème, vous devez construire manuellement la chaîne SQL et utiliser Python pour concaténer les valeurs dans la clause "IN" :
<code class="python">args=['A', 'C'] sql='SELECT fooid FROM foo WHERE bar IN (%s)' in_p=', '.join(list(map(lambda x: '%s', args))) sql = sql % in_p cursor.execute(sql, args)</code>
Alternativement, pour Python 2, vous pouvez utiliser le code suivant :
<code class="python">args=['A', 'C'] sql='SELECT fooid FROM foo WHERE bar IN (%s)' in_p=', '.join(map(lambda x: '%s', args)) sql = sql % in_p cursor.execute(sql, args)</code>
Ce code génère dynamiquement la chaîne SQL avec le nombre correct d'espaces réservés ("%s") en parcourir les valeurs du tableau et les joindre par une virgule. En exécutant cette requête construite manuellement, vous obtiendrez le résultat attendu, en sélectionnant les aliments où se trouve la colonne "bar" ('A','C')
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!