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

use*_*980 4 sql sqlalchemy execute declare

我被困住了——我有以下带有 SQL alchemy 的 python 脚本,我已经非常成功地将其用于其他几个目的。

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
Run Code Online (Sandbox Code Playgroud)

最近,我发现如果我的“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.
Run Code Online (Sandbox Code Playgroud)

这是我的 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
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么 SQLAlchemy 会给我这个错误?我应该怎么做才能解决这个问题?

zzz*_*eek 5

当 DBAPI 在游标上执行时,如果存在结果,则需要cursor.description存在一个名为的属性。如果不是,SQLAlchemy 就知道没有结果可返回。

在这种情况下,这可能是 DBAPI 的问题,除非这种用法属于游标上“多个结果集”的范围。SQLAlchemy 到目前为止还没有直接支持多个结果集。如果是这种情况,您需要直接使用 DBAPI 游标并调用.nextset()来获取结果。您可以通过以下方式获取:

connection = engine.raw_connection()
cursor = connection.cursor()
Run Code Online (Sandbox Code Playgroud)

(关于cursor.nextset()如何工作的文档位于http://www.python.org/dev/peps/pep-0249/

否则,您确实需要联系 DBAPI 作者,看看您在这里所做的是否真的可行。我猜这是 pyodbc,即使您没有指定您所在的后端。如果是这样,您可以通过http://code.google.com/p/pyodbc/与他们联系。