2011-05-16 5 views
2

Étant donné une grande liste (~ 10 000) d'entiers en Python, comment puis-je efficacement SELECT tous les éléments d'une table dont l'identifiant est dans la liste?Requêtes paramétrées avec psycopg2: SELECT à partir d'une liste Python

J'ai essayé:

>>> lst2 
[{'id': 97600167}, {'id': 97600168}, {'id': 97611194}] 
>>> cur.executemany("SELECT id, parent_id FROM my_table WHERE id=%(id)s", lst2) 
>>> cur.fetchall() 
[(97611194, 10020688), (None, None), (None, None)] 

Le deuxième et troisième id (97600168, 97611194) existent dans le tableau.

Répondre

5

En utilisant votre exemple, utilisez where id in puis passer un paramètre qui est un tuple des valeurs id que vous souhaitez sélectionner:

>>> lst2 
[{'id': 97600167}, {'id': 97600168}, {'id': 97611194}] 
>>> ids = tuple(x['id'] for x in lst2) 
>>> cur.execute("SELECT id, parent_id FROM my_table where id in %s",[ids]) 
+0

+1 pour passer un [tuple()] –

+0

Merci, mais il donne moi un 'psycopg2.ProgrammingError: ne peut pas adapter' exception. –

+0

Quelle version utilisez-vous? J'ai testé ce paramétrage sur 'psycopg2 .__ version__ == 2.0.14' avant de poster. Vous avez réussi (une seule séquence de) un tuple de 'int' n'est-ce pas, comme montré dans mon exemple? – MattH

Questions connexes