2016-10-21 1 views
-1

Mon exigence est de vérifier s'il y a des entrées dans une table correspondant à une liste de valeurs pour une colonne. J'utilise la requête suivante:Vérifiez pour plusieurs valeurs existe dans la base de données dans MySQLdb python?

insert_enquiry = """SELECT P_ID,Jobname FROM build_table WHERE Build_number IN %s;""" % insert_constraint 

insert_constraint est ici une liste de numéros. Build_number est une colonne qui a des entiers. Si je tente d'exécuter cette requête en utilisant:

cursor.execute(insert_enquiry) 

Je reçois l'erreur suivante:

MySQL Error [1064]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[184, 931, 1005, 1070, 165, 99, 365, 930, 164, 98' at line 1 

Je crois que cela est à cause des crochets qui apparaissent dans la liste. J'ai essayé de les supprimer en convertissant la liste en chaîne, mais ensuite j'obtiens la même erreur que maintenant la liste entière est convertie en chaîne.

J'ai aussi essayé la syntaxe suivante:

insert_enquiry = """SELECT P_ID,Jobname FROM product_build WHERE Build_number IN %s;""" 
cursor.executemany(insert_enquiry, insert_constraint) 

Cela donne l'erreur suivante:

MySQL Error [1064]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '184' at line 1 

Edit:

insert_enquiry = """SELECT P_ID,Jobname FROM product_build WHERE Build_number IN (%s);""" 
cursor.executemany(insert_enquiry, insert_constraint) 

Cela ne prend que le dernier élément de la liste insert_constraint pour une raison quelconque.

+0

N'est-ce pas ** IN (...) ** au lieu de ** IN [...] **? –

+0

Oui, j'ai fait un edit aux questions. Il prend en quelque sorte le dernier élément de la liste insert_constraint et ignore tous les éléments de la liste. –

Répondre

0

Grâce à https://stackoverflow.com/a/4574647/4077331.

L'idée était d'ajouter len(insert_constraint) numéro de %s à la chaîne de requête. En faisant cela, la requête acceptera une liste pour la WHERE IN clause

insert_enquiry = "SELECT build_number,jobname FROM %s WHERE build_number IN (%s);" 
insert_enquiry_string =', '.join(map(lambda x: '%s', insert_constraint_build_num)) 
insert_enquiry = insert_enquiry % (table_name, insert_enquiry_string) 
cursor.execute(insert_enquiry, insert_constraint_build_num) 

Ceci a résolu la question.