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

