使用SQLAlchemy调用MySQL存储过程时出现Commands out of sync错误
MySQL存储过程在SQLAlchemy中执行报"Commands out of sync"错误的解决方法
错误原因
调用返回结果集的MySQL存储过程时,MySQL服务器会先返回查询结果,再返回一个"OK"状态包标记存储过程执行完成。你使用的mysqlconnector驱动默认未启用多结果集处理功能,导致SQLAlchemy连接池回收连接时,连接仍处于未清理的多结果集状态,执行回滚操作时触发Commands out of sync; you can't run this command now错误。
而MySQL终端、JDBC驱动默认会自动处理所有返回的结果包,因此不会出现该问题。
解决步骤
- 导入多结果集常量:从
mysql.connector.constants中引入CLIENT类,启用MULTI_RESULTS标记 - 配置SQLAlchemy引擎:在
create_engine的connect_args参数中添加client_flags,开启多结果集支持
修正后的代码示例
from sqlalchemy import create_engine from sqlalchemy.pool import NullPool from mysql.connector.constants import CLIENT # 启用多结果集支持的引擎配置 engine = create_engine( "mysql+mysqlconnector://my_user:my_pass@my_server/my_db", poolclass=NullPool, connect_args={"client_flags": [CLIENT.MULTI_RESULTS]} ) # 执行存储过程并读取结果 with engine.connect() as conn: res = conn.execute('call exampleone()').fetchall()
补充说明
- 如果存储过程包含多个SELECT语句、返回多个结果集,需同时启用
CLIENT.MULTI_STATEMENTS标记 - 使用
with engine.connect()上下文管理器可确保连接正确回收,避免连接池中的脏连接问题
内容的提问来源于stack exchange,提问作者QLands - Carlos Quiros
相关产品推荐
相关产品推荐

