带参数的Pandas read_sql

时间:2014-06-25 12:21:42

标签: python sql pandas

是否有任何关于如何在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运行这些类型的查询的推荐方法是什么?

1 个答案:

答案 0 :(得分:55)

read_sql文档说这个params参数可以是列表,元组或字典(请参阅docs)。

要传递sql查询中的值,可能会有不同的语法:?:1:name%s%(name)s(请参阅{ {3}})。
但并非所有这些可能性都受到所有数据库驱动程序的支持,支持哪种语法取决于您使用的驱动程序(我假设您的情况为psycopg2)。

在第二种情况下,当使用dict时,您使用的是命名参数',并且根据psycopg2文档,它们支持%(name)s样式(所以不支持我认为:name),请参阅PEP249 所以使用这种风格应该有效:

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