【问题标题】:Result object does not return rows when querying SQL Server database查询 SQL Server 数据库时,结果对象不返回行
【发布时间】:2019-03-21 19:25:27
【问题描述】:

代码:

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 文件以使数据进入数据框?

【问题讨论】:

标签: python sql sql-server pandas sqlalchemy


【解决方案1】:

遇到了类似的问题。据我所知,它源于 SQL Server 将临时表创建的结果作为结果集反馈。根据您的查询正在做什么,它可能会返回许多结果集以及您想要的集。它可能来自 Pandas 在后台使用的 sqlalchemy 行为。

一些解决方案是将SET NOCOUNT ONSET ANSI_WARNINGS OFF 添加到查询的顶部。试过了,还是不行。

最终起作用的是从 sqlalchemy 获取游标并将游标移动到所需的结果集。你得到的结果是一个元组列表,然后你可以使用DataFrame.from_records() 来构建你的数据框。

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

【讨论】:

    猜你喜欢
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多