【问题标题】:Usage error in pandas.read_sql with sqlalchemy使用 sqlalchemy 的 pandas.read_sql 中的使用错误
【发布时间】:2019-05-16 13:26:21
【问题描述】:

假设您有以下代码:

import pandas as pd
pd.read_sql("SELECT * FROM foo_schema.run_info WHERE id=:param order by run_id desc", s.bind, **{'param':5})

s.bindsqlchemy 的引擎对象。

我收到以下错误:

{TypeError}read_sql() got an unexpected argument 'param'

我的函数调用有什么问题?

【问题讨论】:

  • {'param':5} 应该是什么?
  • 只是将参数传递给查询的简单示例,我们有占位符WHERE id=:param,因此在这种情况下需要将其解析为WHERE id=5
  • @IljaEverilä:我已经看到了。知道吗,为什么即使尝试了coldspeed 的建议答案后我仍然会出错?

标签: python pandas sqlalchemy


【解决方案1】:

来自docs

pd.read_sql?
...
params : list, tuple or dict, optional, default: None

您正在做的是解压缩字典,因此它作为关键字参数传递。请参阅Understanding kwargs in Python 了解更多信息。

正确的传参方式是:

pd.read_sql(... params={'param':5})

正如@Ilja Everilä 专业提到的,您应该将查询包装在对text 的调用中,以便正确解析参数语法。

from sqlalchemy import text
pd.read_sql(text(query), s.bind, params={'param':5})

【讨论】:

  • 我做到了,但得到了:sqlalchemy.exc.ProgrammingError: (_mysql_exceptions.ProgrammingError) (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':param order by run_id desc' at line 1") `
  • 冒号风格的命名参数不是很多 DB-API 驱动程序支持的(虽然它是part of the spec),但如果你看过 SQLA 文档,你可能会选择它向上。 SQLA text() 构造使用它来提供与 DB-API 无关的命名参数处理。所以解决方法是将query 包装在对text() 的调用中,然后再传递给read_sql()
  • @IljaEverilä 想要这个吗?我很乐意删除。
  • 不,只需修改 text(query) 即可:)
猜你喜欢
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 2020-10-29
相关资源
最近更新 更多