2015-11-02 398 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

相关问题