Python 使用参数读取sql

Python 使用参数读取sql,python,sql,pandas,psycopg2,Python,Sql,Pandas,Psycopg2,有没有关于如何在Pandas中通过SQL查询传递参数的示例 特别是,我使用SQLAlchemy引擎连接到PostgreSQL数据库。到目前为止,我发现以下方法有效: df = psql.read_sql(('select "Timestamp","Value" from "MyTable" ' 'where "Timestamp" BETWEEN %s AND %s'), db,params=[datetime(20

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

读取sql文档说此
参数可以是列表、元组或dict(请参阅)

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

在第二种情况下,当使用dict时,您使用的是“命名参数”,根据
psycopg2
文档,它们支持
%(name)s
样式(因此不是
:name
),请参见。
因此,使用这种风格应该是可行的:

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

这非常有帮助-我使用的是psycopg2,因此“%”(name)的语法非常有效。我们可能应该在docstring中提到这一点:此解决方案不再适用于Postgres-需要使用
:表示法
,然后确保使用
sqlalchemy.text()包装SQL字符串
这在使用SQLAlchemy引擎的SQLite上不起作用。SQLite使用
:name
样式,请参阅