将sqlalchemy ORM查询对象转换为Pandas DataFrame的sql查询

时间:2015-08-05 13:08:23

标签: pandas sqlalchemy

这个问题非常简单,但我找不到答案。

我有一个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字符串,而是将查询的返回处理为原始元组。

3 个答案:

答案 0 :(得分:3)

在sqlalchemy的常见问题解答中详细描述了长版本: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

答案 1 :(得分:0)

确实非常简单。 Per 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 :(得分:0)

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

print(query)

输出查询,您可以将其复制并粘贴回脚本中。