如何在Python MySQL Connector中获取.sql文件多语句执行结果?
解决AWS Lambda中MySQL执行多语句脚本的报错问题
核心问题分析
你遇到的报错本质是:即使设置了multi=True,MySQL连接器在处理多语句时,若某条语句触发警告且未被显式处理,就会抛出这个错误——因为生成器遍历过程中,未处理的警告会被后续操作触发检查。
具体解决方案
强制遍历并处理所有结果与警告
不要跳过任何执行结果,包括DDL语句的响应和警告信息。用循环遍历生成器的同时,主动调用cursor.fetchwarnings()捕获警告,示例代码如下:import mysql.connector from mysql.connector import Error def lambda_handler(event, context): conn = None cur = None try: # 建立RDS连接 conn = mysql.connector.connect( host="your-rds-endpoint", user="db-user", password="db-pass", database="target-db" ) cur = conn.cursor() # 读取SQL脚本 with open("script.sql", "r") as f: sql_content = f.read() # 执行多语句,获取结果生成器 results_gen = cur.execute(sql_content, multi=True) # 遍历所有执行结果 for res in results_gen: # 处理有返回数据的语句(如SELECT) if res.with_rows: print(f"查询返回行数: {len(res.fetchall())}") # 处理无返回数据的语句(如INSERT/UPDATE/CREATE) else: print(f"受影响行数: {res.rowcount}") # 主动捕获并打印警告 warnings = cur.fetchwarnings() if warnings: print(f"执行警告: {warnings}") conn.commit() print("脚本执行完成") except Error as e: print(f"执行错误: {str(e)}") if conn: conn.rollback() finally: # 清理资源 if cur: cur.close() if conn: conn.close()检查SQL脚本的语句分隔符
如果脚本包含存储过程、触发器这类带内部分号的代码,必须先临时修改语句分隔符,否则连接器会错误拆分语句:-- 临时修改分隔符为// DELIMITER // CREATE PROCEDURE test_proc() BEGIN INSERT INTO test_table VALUES(1); UPDATE test_table SET name='test' WHERE id=1; END // -- 恢复默认分隔符 DELIMITER ;这种场景下
multi=True会按设置的分隔符正确识别语句,避免执行异常。升级MySQL连接器版本
旧版mysql-connector-python存在multi=True的兼容性bug,将Lambda使用的连接器版本升级到8.0.x及以上,可修复部分已知问题。拆分大脚本分批执行
若脚本包含数百条以上语句,拆分成多个小批次执行,减少单次执行的语句数量,降低警告处理的异常概率。
内容的提问来源于stack exchange,提问作者Gwenda Thomas
相关产品推荐
相关产品推荐

