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

Python3+Flask中MySQL LIKE查询出现ProgrammingError报错求助

解决Flask中MySQL LIKE查询的ProgrammingError问题

这个错误的核心原因是你错误地处理了SQL参数的传递方式,手动添加单引号+参数格式不对导致的。咱们一步步来修复:

错误原因分析

你原来的代码里,手动把搜索字符串包装成了带单引号的likeString = "'%" + search_string + "%'",然后直接传给execute。但MySQLdb的execute方法要求第二个参数是参数序列(比如元组),而且SQL中的%s占位符会自动帮你处理字符串的引号和转义——你手动加的单引号反而会让SQL把整个'%xxx%'当成一个带引号的字符串字面量,导致参数不匹配,触发ProgrammingError。

正确的参数化查询写法(推荐,防SQL注入)

直接把带通配符的字符串作为参数传入,不需要手动加单引号,同时确保参数是元组格式:

search_string = search.data['search']
cur = mysql.connection.cursor()
# 拼接通配符,然后作为元组的元素传递(注意末尾的逗号,确保是元组)
cur.execute('SELECT title FROM Book WHERE title LIKE %s;', ('%' + search_string + '%',))
# 获取查询结果
results = cur.fetchall()
# 记得关闭游标
cur.close()

为什么推荐这种写法?

这是参数化查询的标准写法,不仅能解决你的错误,更重要的是能防止SQL注入攻击。如果用户输入恶意内容(比如'; DROP TABLE Book; --),手动拼接字符串会直接执行恶意SQL,而参数化查询会自动转义特殊字符,保证数据安全。

另一种等价写法(用f-string拼接通配符)

如果你习惯用f-string拼接通配符,也可以这样写,本质和上面一样:

cur.execute('SELECT title FROM Book WHERE title LIKE %s;', (f'%{search_string}%',))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:36:12