繁体   English   中英

带参数的 Pandas read_sql

[英]Pandas read_sql with parameters

有没有关于如何在 Pandas 中使用 SQL 查询传递参数的示例?

特别是我使用 SQLAlchemy 引擎连接到 PostgreSQL 数据库。 到目前为止,我发现以下工作:

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

Pandas 文档说 params 也可以作为 dict 传递,但我似乎无法让它工作,例如:

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

从 Pandas 运行这些类型的查询的推荐方法是什么?

read_sql文档说这个params参数可以是一个列表、元组或字典(参见docs )。

要在 sql 查询中传递值,可能有不同的语法: ? , :1 , :name , %s , %(name)s (参见PEP249 )。
但并非所有数据库驱动程序都支持所有这些可能性,支持哪种语法取决于您使用的驱动程序(我想在您的情况下为psycopg2 )。

在第二种情况下,当使用字典时,您使用的是“命名参数”,并且根据psycopg2文档,它们支持%(name)s样式(因此不支持:name我想),请参见http:// initd.org/psycopg/docs/usage.html#query-parameters
所以使用这种风格应该有效:

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'])
import psycopg as pg
import pandas.io.sql as iosql
conn = pg.connect("...")
iosql.read_sql("select a,b from c where d = %s", conn, params=["dval"])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM