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()
不会。
我在使用 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()
不会。