如何解决Flask应用运行SQL语句时触发的pymysql语法报错问题
问题原因
- 直接报错来源于WHERE子句的语法错误:你写的SQL末尾出现了重复的
WHERE Orden=片段,最终拼接后生成了WHERE Orden=WHERE Orden='a365'的非法语法,不符合MySQL UPDATE语句的规范。 - 还存在隐藏的语法问题:SET子句最后一个字段
Reporte的赋值语句末尾多了多余的逗号,MySQL不允许SET字段列表的最后一项后面跟随逗号再衔接WHERE子句。 - 额外风险:你当前直接用字符串拼接的方式填充SQL参数,存在SQL注入风险,且如果参数值包含单引号会再次触发语法报错。
解决方法
1. 修正SQL语法
修正后的SQL模板如下:
UPDATE Servi SET Orden = CASE WHEN Orden IS NOT NULL THEN %s END, Dependencia = CASE WHEN Dependencia IS NOT NULL THEN %s END, Atencion = CASE WHEN Atencion IS NOT NULL THEN %s END, Recibio_del_cer = CASE WHEN Recibio_del_cer IS NOT NULL THEN %s END, Entrego_al_cer = CASE WHEN Entrego_al_cer IS NOT NULL THEN %s END, Folio = CASE WHEN Entrego_al_cer IS NOT NULL THEN %s END, Entrada = CASE WHEN Entrego_al_cer IS NOT NULL THEN %s END, Equipo = CASE WHEN Equipo IS NOT NULL THEN %s END, Marca = CASE WHEN Marca IS NOT NULL THEN %s END, Modelo = CASE WHEN Modelo IS NOT NULL THEN %s END, Serie = CASE WHEN Serie IS NOT NULL THEN %s END, Unidad = CASE WHEN Unidad IS NOT NULL THEN %s END, Delegacion = CASE WHEN Delegacion IS NOT NULL THEN %s END, Accesorio = CASE WHEN Accesorio IS NOT NULL THEN %s END, Falla = CASE WHEN Falla IS NOT NULL THEN %s END, Ticket = CASE WHEN Ticket IS NOT NULL THEN %s END, Status = CASE WHEN Status IS NOT NULL THEN %s END, Reparacion = CASE WHEN Reparacion IS NOT NULL THEN %s END, Salida = CASE WHEN Salida IS NOT NULL THEN %s END, Reparo = CASE WHEN Reparo IS NOT NULL THEN %s END, Servicio = CASE WHEN Servicio IS NOT NULL THEN %s END, Reporte = CASE WHEN Reporte IS NOT NULL THEN %s END WHERE Orden = %s
注意:去掉了Reporte字段末尾的多余逗号,删除了重复的WHERE Orden=片段,同时把所有%s外侧的单引号去掉,改用参数化查询传值。
2. 使用参数化查询执行SQL
Flask + PyMySQL 场景下不要手动拼接字符串填充参数,按照如下方式执行即可:
# 参数顺序要和SQL里%s的顺序完全对应,最后一个是查询条件Orden的值 params = (orden_val, dependencia_val, atencion_val, ..., filter_orden_val) cursor.execute(sql, params) conn.commit()
内容的提问来源于stack exchange,提问作者mimus
相关产品推荐
相关产品推荐

