使用MySQL Connector通过Python创建存储过程遇命令不同步错误
解决Python MySQL Connector执行存储过程时的"Commands out of sync"错误
错误原因
- DELIMITER命令不被支持:
DELIMITER是MySQL客户端工具(如Workbench)的专属命令,并非MySQL服务器可解析的SQL指令,Python的MySQL Connector无法识别该命令,直接执行会导致语法解析异常。 - 未处理存储过程返回的结果集:你的存储过程内部包含
SELECT * FROM mytable语句,执行后会生成结果集,若未读取该结果集就执行后续数据库操作,会触发"Commands out of sync"错误。
修正后的代码实现
import mysql.connector # 替换为你的数据库连接参数 HOST = 'your_host' USERNAME = 'your_username' PASSWORD = 'your_password' DBNAME = 'your_db' PORT = 3306 mydb = mysql.connector.connect( host=HOST, user=USERNAME, passwd=PASSWORD, database=DBNAME, port=PORT, allow_local_infile=True ) cursor = mydb.cursor() # 1. 删除已存在的存储过程 cursor.execute("DROP PROCEDURE IF EXISTS usp_myprocedure") # 2. 创建存储过程(无需DELIMITER,直接传入完整定义) create_proc_sql = """ CREATE PROCEDURE usp_myprocedure() BEGIN TRUNCATE TABLE mytable; INSERT INTO mytable SELECT col1 ,col2 ,col3 ,col4 ,CASE WHEN New_col LIKE '%_%' THEN logic1 ELSE logic2 END AS mylogic FROM oldtable; SELECT * FROM mytable; END """ cursor.execute(create_proc_sql) mydb.commit() # 3. 执行存储过程并处理结果集 cursor.execute("CALL usp_myprocedure()") # 读取所有结果,避免命令不同步 results = cursor.fetchall() # 可选:遍历打印结果 for row in results: print(row) # 关闭资源 cursor.close() mydb.close()
额外注意事项
- 原代码中
New_col='%_%'是精确匹配字符串%_%,如果你的需求是匹配包含下划线的字符串,应该改用LIKE '%_%'(已在修正代码中调整)。 - 若需要在单个
execute调用中执行多个SQL语句,需设置multi=True参数,但拆分执行更易排查问题,建议优先使用拆分方式。 - 所有返回结果集的数据库操作(如SELECT、带查询的存储过程)都必须读取结果,否则会阻塞后续操作。
内容的提问来源于stack exchange,提问作者Roshan
相关产品推荐
相关产品推荐

