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

Python插入MySQL数据时触发SQL语法错误该如何解决?

问题诱因
  • 核心原因是你使用Python原生的%字符串格式化直接拼接SQL语句,没有做特殊字符转义:当parsed_data["category"]或parsed_data["taste"]中包含单引号、双引号等SQL语法特殊字符时,会直接破坏SQL的结构。比如你的category字段值为Candy'(末尾带一个单引号),拼接后的SQL会变成INSERT INTO Food (category, taste) VALUES ('Candy'', 'Sweet'),MySQL解析时会将'Candy'识别为第一个参数的完整值,后续的'、, 'Sweet')都会被判定为非法语法片段。
  • 你看到报错里的)并不是来自你的业务数据,是SQL本身VALUES(...)的闭合括号,因为前面的语法结构已经错乱,才被归入了非法内容区域,所以你排查taste字段找不到多余括号是正常的。
  • 这种直接拼接SQL的写法还存在SQL注入风险,属于不推荐的实现方式。
解决方案

Python的MySQL驱动(如pymysql、mysql-connector-python)的cursor.execute原生支持参数化查询,不需要手动拼接SQL字符串,驱动会自动处理所有特殊字符的转义,从根本上避免语法错误和注入风险,修改后的代码如下:

import json

def insertion(database, data):
    parsed_data = json.loads(data)
    cursor = database.cursor()
    # 占位符%s直接写在SQL里,参数以元组形式作为execute的第二个参数传入
    cursor.execute("INSERT INTO Food (category, taste) VALUES (%s, %s)", (parsed_data["category"], parsed_data["taste"]))
    database.commit()

注意事项:

  • 此处SQL中的%s是SQL参数占位符,和Python的字符串格式化%s语法没有关系,不需要额外加引号包裹,驱动会自动根据参数类型处理格式。
  • 如果需要批量插入多条数据,可使用cursor.executemany方法,性能远高于循环调用execute。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:54:04