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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 08:25:12