带参数的Pandas read_sql

tob*_*man 50 python sql psycopg2 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'])
Run Code Online (Sandbox Code Playgroud)

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'])
Run Code Online (Sandbox Code Playgroud)

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

jor*_*ris 67

read_sql文件说这个params参数可以是一个列表,元组或字典(见文档).

通过在SQL查询中的值,也有不同的语法可能的:?,:1,:name,%s,%(name)s(见PEP249).
但并非所有这些可能性都受到所有数据库驱动程序的支持,支持的语法取决于您使用的驱动程序(psycopg2在我的情况下,我想).

在你的第二种情况下,当你使用dict时,你正在使用'命名参数',并且根据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'])
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案不再适用于Postgres-需要使用`:notation`,然后确保使用`sqlalchemy.text()'包装SQL字符串。 (7认同)
  • SQLite 使用 `:name` 样式,参见 https://docs.python.org/3/library/sqlite3.html#sqlite3.Cursor.execute (3认同)
  • 这非常有帮助 - 我正在使用 psycopg2,因此 '%(name)s 语法完美运行。 (2认同)