2011-12-29 19 views
27

Tengo una lista de identificadores de filas para recuperar de la base de datos. Estoy usando python y psycopg2, y mi problema es cómo pasar efectivamente esos identificadores a SQL. Quiero decir que si conozco la longitud de esa lista, es bastante fácil porque siempre puedo agregar manualmente o automáticamente tantas expresiones "% s" en la cadena de consulta como sea necesario, pero aquí no sé cuánto necesito. . Es importante que necesite seleccionar las filas usando la declaración sql "id IN (id1, id2, ...)". Sé que es posible verificar la longitud de la lista y concatenar el número adecuado de "% s" en la cadena de consulta, pero me temo que sería muy lento y feo. ¿Alguien tiene una idea sobre cómo resolverlo? Y por favor no pregunte por qué tengo que hacerlo con la declaración "IN" - es un punto de referencia que es parte de mi asignación de clase. ¡Gracias por adelantado!Pasando la lista de parámetros a SQL en psycopg2

+0

¿Se opone a una respuesta de SQL? Al usar SQL dinámico, puede dar una cadena de cualquier longitud y hacer que SQL la lea correctamente. – Twelfth

Respuesta

47

tuplas Python se convierten en listas de SQL en psycopg2:

cur.mogrify("SELECT * FROM table WHERE column IN %s;", ((1,2,3),)) 

emitiría

'SELECT * FROM table WHERE column IN (1,2,3);' 

para Python recién llegados: Por desgracia, es importante utilizar una tupla, no una lista aquí. Segundo ejemplo:

cur.mogrify("SELECT * FROM table WHERE column IN %s;", 
    tuple([row[0] for for in rows])) 
+0

Gracias, no me di cuenta. El único problema con su solución es que ha olvidado la coma en esa tupla. –

+0

gracias - se corrigió – philofinfinitejest

+25

Tenga en cuenta que las LISTAS de Python se convertirán en tipos de ARCHIVO Postgres, así que me parece que con frecuencia necesito hacer algo como (tupla (SOME_LIST),) en mis argumentos cursor.execute (...). Observe cómo estamos envolviendo la tupla() de la lista en una tupla literal de un solo elemento, por lo que tenemos una tupla de tuplas como se muestra en este ejemplo. –

Cuestiones relacionadas