Saltar al contenido

Lista de vinculación a parámetros en Pandas read_sql_query con otros parámetros

Solución:

Divida esto en tres partes para ayudar a aislar el problema y mejorar la legibilidad:

  1. Construye la cadena SQL
  2. Establecer valores de parámetro
  3. Ejecute pandas.read_sql_query

Construir SQL

Primero asegúrate ? los marcadores de posición se están configurando correctamente. Use str.format con str.join y len para completar dinámicamente ?s basado en member_list largo. Los siguientes ejemplos suponen 3 member_list elementos.

Ejemplo

member_list = (1,2,3)
sql = """select member_id, yearmonth
         from queried_table
         where yearmonth between {0} and {0}
         and member_id in ({1})"""
sql = sql.format('?', ','.join('?' * len(member_list)))
print(sql)

Devoluciones

select member_id, yearmonth
from queried_table
where yearmonth between ? and ?
and member_id in (?,?,?)

Establecer valores de parámetros

Ahora asegúrese de que los valores de los parámetros estén organizados en un plano tupla

Ejemplo

# generator to flatten values of irregular nested sequences,
# modified from answers http://stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in-python
def flatten(l):
    for el in l:
        try:
            yield from flatten(el)
        except TypeError:
            yield el

params = tuple(flatten((201601, 201603, member_list)))
print(params)

Devoluciones

(201601, 201603, 1, 2, 3)

Ejecutar

Finalmente trae el sql y params valores juntos en el read_sql_query llamada

query = pd.read_sql_query(sql, db2conn, params)

Si está usando python 3.6+, también puede usar una cadena con formato literal para su consulta (consulte https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-pep498)

start, end = 201601, 201603
selected_members = (111, 222, 333, 444, 555)  # requires to be a tuple

query = f"""
    SELECT member_id, yearmonth FROM queried_table
    WHERE yearmonth BETWEEN {start} AND {end}
      AND member_id IN {selected_members}
"""

df = pd.read_sql_query(query, db2conn)
¡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 *