2015-11-02 436 views
3

我想在SQL服務器上執行存儲過程並使用python保存結果 - 我決定使用pymssql,因爲它看起來像是最簡單的解決方案。pymssql執行存儲過程,但不返回結果

print pymssql.__version__ 

server = 'MY\SERVER' 
user = 'user' 
password = 'password' 
database = 'db' 
proc = 'checkin' 

with pymssql.connect(server, user, password, database) as conn: 
    with conn.cursor() as cursor: 

     cursor.callproc(proc, (eha, ip, url, alias, location, rotation)) 
     conn.commit() 

     f = open('/var/wwwdata/locations.txt', 'w') 
     for row in cursor: 
      print(row['Alias']) 
      f.write(row['Alias'] + '\n') 
     f.close() 

SQL查詢中執行一些插入/更新,並與

SELECT Alias FROM MyTable 

運行從SSMS的SP結束工作正常,但運行在Python的SP執行但插入/更新功能不返回任何結果。

根據pymssql documentation,這是一個已知的問題。但是,我找不到可行的解決方案。

我嘗試了一些不同的建議,我在網上找到了各地,包括

  • 檢查了我的pymssql版本(2.1.1)
  • 申報光標dict=true
  • 使用cursor.nextset()cursor.commit()
  • 取結果使用cursor.fetchall()cursor.fetchone(),兩者都導致類似的例外:

OperationalError: Statement not executed or executed statement has no resultset

有沒有人知道解決這個問題?或者,是否有更穩定的python與SQL服務器接口的解決方案(尤其是調用存儲過程)?我想我也應該問,我是否完全錯誤?

而且認爲它可能是值得注意的:操作系統是Raspbian上樹莓派2 B型運行

回答

5

我已成功地解出這道題。調用conn.commit()正在使光標失去其結果。我可能誤讀了一些pymssql文檔,並錯誤地添加了這行 - 代碼完美無缺。

編輯:我注意到,我做了這個改變後,存儲過程會返回結果,但過程的插入/更新部分沒有保存。現在我很清楚conn.commit()在做什麼。如果您的存儲過程返回結果並對數據庫進行了更改,則在您獲取它們之後需要調用conn.commit()

server = 'MY\SERVER' 
user = 'user' 
password = 'password' 
database = 'db' 
proc = 'checkin' 

with pymssql.connect(server, user, password, database) as conn: 
    with conn.cursor() as cursor: 
     cursor.callproc(proc, (eha, ip, url, alias, location, rotation)) 
     cursor.nextset() 
     results = cursor.fetchall() 
     conn.commit() 
     f = open('/var/wwwdata/locations.txt', 'w') 
     for result in results: 
      print result[0] 
      f.write(result[0]) 
     f.close() 
+0

謝謝。我永遠不會自己發現這一點。 – user568021

相關問題