python pyodbc:在 conn.commit() 之前关闭游标?

python pyodbc: Closing the cursor before conn.commit()?

我在使用 python 包 pyodbc 将数据插入数据库时​​遇到问题,并且由于我对 pyodbc 和数​​据库总体上还很陌生,所以我可能缺乏一些基本的了解。

我打开一个连接,然后我想要执行我的查询。 实际上,在这个查询中我调用了一个存储过程(我没有写并且不允许更改!)。 此过程执行“一个或两个”插入。当我像这样使用 pyodbc 时

conn = pyodbc.connect(connection_string)
with conn:
    c = conn.cursor()
    c.execute("{call input_procedure('some','parameters','to','insert')}")

conn = pyodbc.connect(connection_string)
c = conn.cursor()
c.execute("{call input_procedure('some','parameters','to','insert')}")
conn.commit()

我收到以下错误消息: pyodbc.Error: ('HY000', "[HY000] [MySQL][ODBC 8.0(a) Driver]Commands out of sync; you can't run this command now (2014) (SQLEndTran(SQL_COMMIT))")

据我了解,此错误消息可能是由于在被调用过程中执行了多个插入所致。当我打印执行命令的 return 时,我变成了以下内容:(' ', )

当我关闭游标时,在提交之前,一切正常。像这样:

conn = pyodbc.connect(connection_string)
c = conn.cursor()
c.execute("{call input_procedure('some','parameters','to','insert')}")
c.close()
conn.commit()

我真的不明白这里发生了什么。 这种行为有解释吗?是否在执行提交保存之前关闭游标?

非常感谢您的帮助!

您似乎在 MySQL Connector/ODBC 处理存储过程的结果集时遇到了一个怪癖。对于此示例程序:

CREATE DEFINER=`root`@`localhost` PROCEDURE `input_procedure`(IN `p1` VARCHAR(50))
   MODIFIES SQL DATA
BEGIN
INSERT INTO table1 (txt) VALUES (p1);
SELECT '' AS foo;
END

这个Python代码

crsr = cnxn.cursor()
crsr.execute("{call input_procedure('thing')}")
cnxn.commit()

抛出“命令不同步”错误,而此代码

crsr = cnxn.cursor()
crsr.execute("{call input_procedure('thing')}")
while crsr.nextset():
    pass
cnxn.commit()

不会。