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 会给我这个错误?我应该怎么做才能解决这个问题?
当 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/与他们联系。