Pandas read_sql con parámetros

Resuelto tobycoleman asked hace 10 años • 2 respuestas

¿Hay algún ejemplo de cómo pasar parámetros con una consulta SQL en Pandas?

En particular, estoy usando un motor SQLAlchemy para conectarme a una base de datos PostgreSQL. Hasta ahora he descubierto que lo siguiente funciona:

df = psql.read_sql(('select "Timestamp","Value" from "MyTable" '
                     'where "Timestamp" BETWEEN %s AND %s'),
                   db,params=[datetime(2014,6,24,16,0),datetime(2014,6,24,17,0)],
                   index_col=['Timestamp'])

La documentación de Pandas dice que paramstambién se puede pasar como un dict, pero parece que no puedo hacer que esto funcione después de haberlo intentado, por ejemplo:

df = psql.read_sql(('select "Timestamp","Value" from "MyTable" '
                     'where "Timestamp" BETWEEN :dstart AND :dfinish'),
                   db,params={"dstart":datetime(2014,6,24,16,0),"dfinish":datetime(2014,6,24,17,0)},
                   index_col=['Timestamp'])

¿Cuál es la forma recomendada de ejecutar este tipo de consultas desde Pandas?

tobycoleman avatar Jun 25 '14 19:06 tobycoleman
Aceptado

Los read_sqldocumentos dicen que este paramsargumento puede ser una lista, tupla o dictado (ver documentos ).

Para pasar los valores en la consulta SQL, hay diferentes sintaxis posibles: ?, :1, :name, (ver PEP249 ). Pero no todas estas posibilidades son compatibles con todos los controladores de bases de datos, la sintaxis compatible depende del controlador que esté utilizando ( en su caso, supongo).%s%(name)s
psycopg2

En su segundo caso, cuando usa un dict, está usando 'argumentos con nombre' y, según la psycopg2documentación, admiten el %(name)sestilo (y :namesupongo que no), consulte http://initd.org/psycopg/docs/ use.html#query-parameters .
Entonces usar ese estilo debería funcionar:

df = psql.read_sql(('select "Timestamp","Value" from "MyTable" '
                     'where "Timestamp" BETWEEN %(dstart)s AND %(dfinish)s'),
                   db,params={"dstart":datetime(2014,6,24,16,0),"dfinish":datetime(2014,6,24,17,0)},
                   index_col=['Timestamp'])
joris avatar Jun 25 '2014 20:06 joris