我正在尝试在SQL服务器上执行存储过程并使用python保存结果 - 我决定使用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 Query执行一些插入/更新,以
结束SELECT Alias FROM MyTable
从SSMS运行SP可以正常工作,但是从Python运行SP会执行插入/更新功能,但不会返回任何结果。
根据pymssql documentation,这是一个已知问题。但是,我找不到有效的解决方案。
我在网上找到了一些不同的建议,包括
dict=true
cursor.nextset()
cursor.commit()
cursor.fetchall()
或cursor.fetchone()
获取结果,两者都会导致类似的例外:OperationalError:语句未执行或已执行语句没有结果集
是否有人知道针对此特定问题的修复程序?或者是否有一个更稳定的解决方案,用于python与SQL服务器的接口(特别是对于调用存储过程)?我想我也应该问,我是否完全错了?
还认为值得注意的是:操作系统是Raspberry Pi 2 Model B上运行的Raspbian
答案 0 :(得分:6)
我设法解决了这个问题。调用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()