这个问题非常简单,但我找不到答案。
我有一个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字符串,而是将查询的返回处理为原始元组。
答案 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)
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)
输出查询,您可以将其复制并粘贴回脚本中。