with readsql read_sql_query read_sql read from create python sql pandas

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''