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

