pymssql执行存储过程但不返回任何结果

lea*_*gcs 6 python sql-server pymssql sql-server-2012

我试图在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()
Run Code Online (Sandbox Code Playgroud)

SQL Query执行一些插入/更新并以结尾

SELECT Alias FROM MyTable
Run Code Online (Sandbox Code Playgroud)

从SSMS运行SP可以正常工作,但是从Python运行SP会执行插入/更新功能,但不会返回任何结果.

根据pymssql文档,这是一个已知问题.但是,我找不到有效的解决方案.

我在网上找到了一些不同的建议,包括

  • 检查了我的pymssql版本(2.1.1)
  • 用.声明游标 dict=true
  • cursor.nextset()之后使用cursor.commit()
  • 使用cursor.fetchall()或获取结果cursor.fetchone(),两者都会导致类似的异常:

OperationalError:语句未执行或已执行语句没有结果集

有谁知道解决这个特殊问题?或者是否有一个更稳定的解决方案,用于python与SQL服务器的接口(特别是对于调用存储过程)?我想我也应该问,我是否完全错了?

还认为值得注意的是:操作系统是在Raspberry Pi 2 Model B上运行的Raspbian

lea*_*gcs 7

我设法解决了这个问题.调用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()
Run Code Online (Sandbox Code Playgroud)