Flask使用flask-mysql执行原生SQL报1064语法错误但SQL Shell运行正常
问题原因
flask-mysql底层依赖的PyMySQL库默认关闭了多语句执行支持,cursor.execute()方法单次仅支持执行一条SQL语句。你传入的初始化脚本包含多条用分号分隔的语句,解析时会识别到非预期的分号内容,触发1064语法错误。- MySQL原生Shell默认开启多语句执行支持,所以直接执行脚本不会报错。
解决方法
方法1:开启连接的多语句执行支持
修改配置开启连接的多语句执行权限,改动量最小,适合SQL脚本完全可控的场景:
- 在
db.py顶部引入多语句支持常量
from pymysql.constants import CLIENT
- 修改
app.py中的连接创建代码,添加多语句支持参数
conn = db.connect(client_flag=CLIENT.MULTI_STATEMENTS)
- 在
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
相关产品推荐
相关产品推荐

