Saltar al contenido

Pasando lista de parámetros a SQL en psycopg2

Solución:

Las tuplas de Python se convierten en listas SQL en psycopg2:

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

saldría

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

Para los recién llegados a Python: Desafortunadamente, es importante usar una tupla, no una lista aquí. Aquí tienes un segundo ejemplo:

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

Ahora el módulo sql de psycopg2 (https://www.psycopg.org/docs/sql.html) se puede usar para protegerse contra errores e inyecciones, como por ejemplo:

import psycopg2
from psycopg2 import sql

params = config()
conn = psycopg2.connect(**params)
cur = conn.cursor()

ids = ['a','b','c']
sql_query = sql.SQL('SELECT * FROM {} WHERE id IN ({});').format(
                    sql.Identifier('table_name'),
                    sql.SQL(',').join(map(sql.Identifier, ids))
                )
print (sql_query.as_string(cur)) # for debug
cur.execute(sql_query)

from configparser import ConfigParser
def config(filename="database.ini", section='postgresql'):
    # create a parser
    parser = ConfigParser()
    # read config file
    parser.read(filename)

    # get section, default to postgresql
    db = {}
    if parser.has_section(section):
        params = parser.items(section)
        for param in params:
            db[param[0]] = param[1]
    else:
        raise Exception('Section {0} not found in the {1} file'.format(section, filename))

    return db

Nota: sql.Identifier agregará comillas si es necesario, por lo que funcionará si también usa identificadores entre comillas en PostgreSQL (deben usarse para permitir, por ejemplo, nombres sensibles a mayúsculas y minúsculas).

Ejemplo y estructura de database.ini:

[postgresql]
host=localhost
port=5432
database=postgres
user=user
password=mypass

esta pregunta es antigua y tal vez haya una más nueva, pero la respuesta que mis colegas están dando ahora mismo es la siguiente:

sql = "SELECT * FROM table WHERE column = ANY(%(parameter_array)s)"
cur.execute(sql,{"parameter_array": [1, 2, 3]})
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *