Pandas read_sql con parámetros
¿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 params
tambié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?
Los read_sql
documentos dicen que este params
argumento 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 psycopg2
documentación, admiten el %(name)s
estilo (y :name
supongo 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'])