You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MySQL Connector通过Python创建存储过程遇命令不同步错误

解决Python MySQL Connector执行存储过程时的"Commands out of sync"错误

错误原因

  1. DELIMITER命令不被支持:DELIMITER是MySQL客户端工具(如Workbench)的专属命令,并非MySQL服务器可解析的SQL指令,Python的MySQL Connector无法识别该命令,直接执行会导致语法解析异常。
  2. 未处理存储过程返回的结果集:你的存储过程内部包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 21:26:25