python - readsql - Pandas read_sql con parámetros
read database with pandas (2)
Los documentos read_sql
dicen que este argumento params
puede ser una lista, tupla o dict (ver docs ).
Para pasar los valores en la consulta sql, hay diferentes sintaxis posibles ?
, :1
PEP249 :name
, %s
, %(name)s
(ver PEP249 ).
Pero no todas estas posibilidades son compatibles con todos los controladores de bases de datos, cuya sintaxis es compatible depende del controlador que esté utilizando ( psycopg2
en su caso).
En su segundo caso, cuando usa un dict, está usando ''argumentos nombrados'', y de acuerdo con la documentación de psycopg2
, admiten el estilo de %(name)s
(y por lo tanto no el :name
supongo), consulte http://initd.org/psycopg/docs/usage.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''])
¿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 encontrado que los siguientes trabajos:
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 los params también se pueden pasar como dict, pero parece que no puedo hacer que esto funcione, 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?
Uso esta configuración con SQLite, lo que significa que puedo manejar parámetros en Python y no en Pandas específicamente. Funciona bien para mí y es más fácil de leer y arroja una consulta y parámetros en read_sql directamente.
con = sqlite3.connect("mydb.db")
verses_sql = ''''''SELECT
kjv.b,
kjv.id,
kjv.t,
kjv.v,
ke.n,
ke.author
FROM t_kjv kjv
LEFT JOIN key_english ke on kjv.b = ke.b
WHERE blah = %s'''''' % blah
df_verses = pd.read_sql(verses_sql, con, index_col=''id'')
Hacerlo de esta manera significa que también puede pasar un dict a la cadena multilínea si lo prefiere:
>>> d = { ''vars'': "variables", ''example'': "example" }
>>> s = "This is an {example} with {vars}"
>>> s.format(**d)
''This is an example with variables''