代码:
engine = db.engine
conn = engine.connect()
query = open('sql_file.sql', 'r')
df = pd.read_sql_query(query.read(), conn)
返回以下错误:
sqlalchemy.exc.ResourceClosedError: This result object does not return rows. It has been closed automatically.
我在sql文件中的查询在SSMS中运行得很好,并返回了一个我想用Pandas读取的大表。为什么它不返回任何行?我如何才能以某种方式执行sql文件,以便数据进入dataframe?
1条答案
按热度按时间nbysray51#
您可能会发现您的
.sql
文件正在生成多个结果集,或者包含生成消息的语句,这些消息被sqlalchemy解释为结果集。例如,创建临时表将包含有关插入了多少行的消息。SSMS将在任何结果集后面的选项卡上显示这些消息,但sqlalchemy不会对如何处理它们做出任何假设。尝试将
SET NOCOUNT ON
或SET ANSI_WARNINGS OFF
添加到查询文件的顶部。这应该会限制返回的消息。还要检查查询是否包含USE
语句,并尝试删除它。可以在连接字符串上设置默认DB。最后,您可以尝试从sqlalchemy获取光标,并使用
cursor.nextset()
将光标移动到所需的结果集。您得到的结果是一个元组列表,然后您可以使用DataFrame.from_records()
构建 Dataframe 。参见:https://docs.sqlalchemy.org/en/13/core/connections.html#multiple-result-sets和:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.from_records.html