SQLAlchemy使用包含@DECLARE本地表的原始SQL执行

时间:2012-02-13 23:58:59

标签: sql sqlalchemy execute declare

我被困 - 我有以下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 个答案:

答案 0 :(得分:4)

当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 :(得分:1)

要更具体地了解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并声明