【问题标题】:Convert sqlalchemy ORM query object to sql query for Pandas DataFrame将 sqlalchemy ORM 查询对象转换为 Pandas DataFrame 的 sql 查询
【发布时间】:2015-10-28 06:53:17
【问题描述】:

这个问题感觉非常简单,但我一直无法找到答案。

我有一个 ORM 查询对象,比如说

query_obj = session.query(Class1).join(Class2).filter(Class2.attr == 'state')

我可以像这样将它读入数据框:

testdf = pd.read_sql(query_obj.statement, query_obj.session.bind)

但我真正想做的是使用传统的 SQL 查询而不是 ORM:

with engine.connect() as connection:
    # Execute the query against the database
    results = connection.execute(query_obj)
    # Fetch all the results of the query
    fetchall = results.fetchall()
    # Build a DataFrame with the results
    dataframe = pd.DataFrame(fetchall)

其中 query 是一个传统的 SQL 字符串。现在,当我运行此程序时,出现“query_obj 不可执行”的错误任何人知道如何将 ORM 查询转换为传统查询?另外在获取数据框后如何获取列?

我这样做的原因:我已经在我的数据库之上设置了一个 ORM 层,并使用它来将数据查询到 Pandas DataFrame。它有效,但它经常耗尽我的记忆。我想通过一些字符串折叠来减少内存开销(此处概述的第 3 步:http://www.mobify.com/blog/sqlalchemy-memory-magic/)。这要求(如果我在这里错了,请纠正我)不使用 read_sql 字符串,而是将查询的返回作为原始元组处理。

【问题讨论】:

  • 您的问题到底是什么?只是如何将 fetchall 的结果放入数据框中?此外,上面的代码有什么问题?我觉得很好。
  • 列名可以从fetchall.keys()获取
  • 我进行了编辑以澄清我的问题。我只是不清楚如何将 ORM query_obj 转换为 SQL 字符串。
  • :) 我看到了答案。如果你发帖我会给你答案!

标签: pandas sqlalchemy


【解决方案1】:

确实非常简单。根据 Jori 到文档的链接,只需 query_obj.statement 即可获取 SQL 查询。所以我的代码是:

with engine.connect() as connection:
    # Execute the query against the database
    results = connection.execute(query_obj.statement)
    # Fetch all the results of the query
    fetchall = results.fetchall()
    # Build a DataFrame with the results
    dataframe = pd.DataFrame(fetchall)

【讨论】:

    【解决方案2】:

    长版在sqlalchemy的FAQ中有详细描述:http://sqlalchemy.readthedocs.org/en/latest/faq/sqlexpressions.html#how-do-i-render-sql-expressions-as-strings-possibly-with-bound-parameters-inlined

    简短的版本是:

    statement = query.statement
    print(statement.compile(engine))
    

    这个结果可以在read_sql中使用。

    【讨论】:

    【解决方案3】:

    这可能是自发布以来的 sqlalchemy 的更高版本。

    print(query)
    

    输出您可以复制并粘贴回脚本的查询。

    【讨论】:

      猜你喜欢
      • 2023-01-20
      • 1970-01-01
      • 2017-04-25
      • 2016-04-20
      • 2015-06-14
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 2019-10-17
      相关资源
      最近更新 更多