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

Flask使用flask-mysql执行原生SQL报1064语法错误但SQL Shell运行正常

问题原因
  • flask-mysql 底层依赖的PyMySQL库默认关闭了多语句执行支持,cursor.execute() 方法单次仅支持执行一条SQL语句。你传入的初始化脚本包含多条用分号分隔的语句,解析时会识别到非预期的分号内容,触发1064语法错误。
  • MySQL原生Shell默认开启多语句执行支持,所以直接执行脚本不会报错。
解决方法

方法1:开启连接的多语句执行支持

修改配置开启连接的多语句执行权限,改动量最小,适合SQL脚本完全可控的场景:

  1. 在db.py顶部引入多语句支持常量
from pymysql.constants import CLIENT
  1. 修改app.py中的连接创建代码,添加多语句支持参数
conn = db.connect(client_flag=CLIENT.MULTI_STATEMENTS)
  1. 在seed_db的SQL执行完成后添加事务提交,否则修改不会持久化到数据库
cursor.execute("""你的多语句SQL脚本""")
# 新增事务提交代码
conn.commit()

方法2:拆分SQL语句单条执行

更稳妥的方案,不需要修改连接配置,也避免了多语句执行的注入风险,兼容性更强:

def seed_db(conn):
    try:
        cursor = conn.cursor()
        sql_script = """
        DROP TABLE IF EXISTS symbol_connection; 
        DROP TABLE IF EXISTS board_symbol; 
        DROP TABLE IF EXISTS symbol; 
        DROP TABLE IF EXISTS board; 
        DROP TABLE IF EXISTS symbol_type; 
        -- 剩下的所有SQL内容保持不变
        SELECT * FROM board;
        """
        # 按分号拆分SQL,过滤空语句和纯空白内容的无效语句
        sql_list = [sql.strip() for sql in sql_script.split(';') if sql.strip()]
        # 逐条执行语句
        for sql in sql_list:
            cursor.execute(sql)
        # 提交事务
        conn.commit()
        # 读取最后一个查询语句的返回结果
        data = cursor.fetchall()
        print(data)
    except Exception as e: 
        print(e)
        # 出错自动回滚事务
        conn.rollback()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:45:03