Объект результата не возвращает строки при запросе базы данных SQL Server - PullRequest
0 голосов
/ 17 октября 2018

Код:

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 и возвращает большую таблицу, которую я хочучитать с пандами.Почему он не возвращает никаких строк и как я могу выполнить файл sql таким образом, чтобы данные перешли в фрейм данных?

1 Ответ

0 голосов
/ 08 мая 2019

Была похожая проблема.Из того, что я видел, это связано с тем, что SQL Server возвращает результат создания временной таблицы как набор результатов.В зависимости от того, что делает ваш запрос, он может вернуть множество наборов результатов, а также набор, который вы хотите.Это может происходить из-за поведения sqlalchemy, которое Pandas использует под капотом.

Некоторые решения включают добавление SET NOCOUNT ON или SET 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...