python 查询SQL Server数据库时,结果对象不返回行

ssgvzors  于 2023-04-04  发布在  Python
关注(0)|答案(1)|浏览(262)

代码:

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?

nbysray5

nbysray51#

您可能会发现您的.sql文件正在生成多个结果集,或者包含生成消息的语句,这些消息被sqlalchemy解释为结果集。例如,创建临时表将包含有关插入了多少行的消息。SSMS将在任何结果集后面的选项卡上显示这些消息,但sqlalchemy不会对如何处理它们做出任何假设。
尝试将SET NOCOUNT ONSET ANSI_WARNINGS OFF添加到查询文件的顶部。这应该会限制返回的消息。还要检查查询是否包含USE语句,并尝试删除它。可以在连接字符串上设置默认DB。
最后,您可以尝试从sqlalchemy获取光标,并使用cursor.nextset()将光标移动到所需的结果集。您得到的结果是一个元组列表,然后您可以使用DataFrame.from_records()构建 Dataframe 。

raw_connection = db_engine.raw_connection()
try:
    cursor = raw_connection.cursor()
    cursor.execute(sql)
    cursor.nextset()

    column_names = [column[0] for column in cursor.description]
    rows = cursor.fetchall() # List of tuples
    
    cursor.close()
finally:
    raw_connection.close()

# Use from_records for a list of tuples
df = pandas.DataFrame.from_records(data=rows, columns=column_names, index=None)

参见: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

相关问题