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
相关产品推荐
相关产品推荐

