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