2012-02-13 73 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有很多時間的表,並宣佈

相關問題