SQLAlchemy Выполнить с необработанным SQL, содержащим локальные таблицы @DECLARE - PullRequest
3 голосов
/ 14 февраля 2012

Я застрял - у меня есть следующий скрипт на Python с алхимией SQL, который я довольно успешно использовал для нескольких других целей.

import sqlalchemy
from sqlalchemy import MetaData
from sqlalchemy.orm import *

engine = sqlalchemy.create_engine("this line of code would provide credentials to the     database")
connection = engine.connect()
session = sessionmaker(bind=engine)
result = connection.execute(sqlquery)

for row in result: print row

Недавно я обнаружил, что если мой 'sqlquery'содержит оператор @Declare MyTable. Я получаю сообщение об ошибке:

"This result object does not return rows. "
sqlalchemy.exc.ResourceClosedError: This result object does not return rows. It has been closed automatically.

Вот мой SQL-запрос, который отлично работает в SSMS, но не выполняется, когда я пытаюсь выполнить его с использованием SQLAlchemy

DECLARE @USER TABLE
(
    UserID INT
    , StatsVals INT
)

INSERT INTO @USER (UserID, StatsVals)
    SELECT TOP 10 u.UserID
    , u.StatsVals
    FROM UserProfile u

SELECT * FROM @USER

Кто-нибудь знает, почему SQLAlchemy будет выдавать мне эту ошибку?Что я должен сделать, чтобы это исправить?

Ответы [ 2 ]

4 голосов
/ 14 февраля 2012

Когда DBAPI выполняется на курсоре, если результаты присутствуют, должен присутствовать атрибут cursor.description.Если это не так, SQLAlchemy знает, что нет результатов для возврата.

В этом случае это, вероятно, проблема с DBAPI, если только это использование не попадает под область «множественных результирующих наборов» на курсоре.SQLAlchemy пока не имеет прямой поддержки нескольких наборов результатов.Если это так, вам нужно использовать курсор DBAPI напрямую и вызвать .nextset(), чтобы получить результаты.Вы можете получить это с помощью:

connection = engine.raw_connection()
cursor = connection.cursor()

(документы о том, как cursor.nextset () работает на http://www.python.org/dev/peps/pep-0249/)

В противном случае вам действительно нужно связаться с автором DBAPI и посмотреть, еслито, что вы делаете здесь, действительно возможно. Я предполагаю, что это pyodbc, даже если вы не указали, какой бэкэнд вы используете. Если это так, вы можете связаться с ними по номеру http://code.google.com/p/pyodbc/.

1 голос
/ 29 июня 2017

Чтобы быть более точным в ответе zzzeek, ​​вы должны сделать что-то подобное

from pyodbc import ProgrammingError
from sqlalchemy import create_engine

# do the connection
engine = create_engine('mssql+pyodbc://user:password@SERVERNAME/DatabaseName?driver=SQL Server')
connection = engine.raw_connection()
cursor = connection.cursor()

# do the query
cursor.execute(query)

# processing it
while True:
    try:
        result = cursor.fetchall()

        # ... do something with result

        if not cursor.nextset(): # trying to get next set
            break
    except ProgrammingError as ex:
        pass

Это помогает мне работать с очень сложным MSSQL с большим количеством временных таблиц и объявляет

...