You need to enable JavaScript to run this app. 使用Python异步调用MySQL存储过程无法执行问题求助
优惠活动
大模型
产品
解决方案
定价
更多

使用Python异步调用MySQL存储过程无法执行问题求助

问题原因分析
  • 未主动提交事务:aiomysql连接默认autocommit参数为False,存储过程中的INSERT操作执行完成后,没有提交事务的话所有修改会被回滚,看起来就像调用没有生效。
  • 异步语法使用不规范:现有代码直接在全局作用域写await关键字,仅Python 3.7+支持在交互环境顶层使用await,普通脚本运行会直接触发语法错误,所有异步操作需要包裹在异步函数中,通过事件循环调度执行。
  • 依赖表不存在:存储过程中往test_async表插入数据,如果该表没有提前创建,存储过程执行时会直接报错终止。
  • 缺少异常捕获逻辑:现有代码没有加异常捕获,存储过程执行报错时无法看到具体错误信息,难以定位实际问题。
解决方案
  1. 提前创建存储过程依赖的test_async表,参考建表语句:
CREATE TABLE IF NOT EXISTS test_async (
    id INT NOT NULL PRIMARY KEY
);
  1. 修正Python代码,补充异步封装、事务提交、异常捕获、资源释放逻辑:
import asyncio
import aiomysql

async def call_stored_proc():
    conn = None
    try:
        conn = await aiomysql.connect(
            host='blah', 
            port=1234, 
            user='user', 
            password='abcd', 
            db='DB',
            autocommit=True # 开启自动提交后无需手动执行commit操作
        )
        async with conn.cursor() as cur:
            await cur.callproc("test_async")
            # 若未开启autocommit,需要在此处添加 await conn.commit()
        print("存储过程调用成功")
    except Exception as e:
        print(f"调用失败,错误信息:{e}")
        if conn:
            await conn.rollback()
    finally:
        if conn:
            conn.close()

if __name__ == "__main__":
    asyncio.run(call_stored_proc())
注意事项
  • 你代码中导入的sqlalchemy相关依赖没有被使用,可以直接删除避免冗余导入。
  • 如果存储过程执行时间较长出现超时问题,可以调整aiomysql连接的connect_timeout参数延长超时时间。

内容的提问来源于stack exchange,提问作者kanchuman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 09:27:00