Maison > base de données > tutoriel mysql > Pourquoi la requête \'SELECT ... WHERE ... IN ...\' échoue-t-elle dans MySQLdb ?

Pourquoi la requête \'SELECT ... WHERE ... IN ...\' échoue-t-elle dans MySQLdb ?

Barbara Streisand
Libérer: 2024-11-01 17:32:02
original
902 Les gens l'ont consulté

Why is

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

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

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!

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