2012-02-13 96 views
2

我被卡住了 - 我有下面的SQL炼金术的Python脚本,我已经很成功地用于其他几个目的。SQLAlchemy使用包含@DECLARE本地表的原始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的是给我这个错误?我应该怎么做才能解决这个问题?

回答

3

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

在这种情况下,这可能是DBAPI的问题,除非此用法属于光标上“多个结果集”的范围。 SQLAlchemy目前还没有直接支持多个结果集。如果是这种情况,您需要直接使用DBAPI游标并调用.nextset()来获得结果。 (上cursor.nextset()是如何工作的,在http://www.python.org/dev/peps/pep-0249/文档)

否则

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

,你真的需要联系DBAPI笔者,看看你在做什么:您可以通过获得此这里真的有可能。我猜这是pyodbc,即使你没有指定你的后端。如果是这样,你可以联系他们http://code.google.com/p/pyodbc/

1

更具体地约zzzeek答案,你应该做这样的事情

from pyodbc import ProgrammingError 
from sqlalchemy import create_engine 

# do the connection 
engine = create_engine('mssql+pyodbc://user:[email protected]/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有很多时间的表,并宣布

相关问题