我被困 - 我有以下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会给我这个错误?我该怎么做才能解决这个问题?
答案 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并声明