为何出现sqlite3.ProgrammingError?Flask+SQLite3搜索排障
SQLite3 LIKE模糊匹配报错原因及修复
问题根源
你写的SQL语句中,LIKE "%?%"里的占位符?被双引号包裹,SQLite会将?识别为普通文本字符,而非需要绑定参数的占位符。这就导致数据库认为当前语句没有需要绑定的参数,但你却传入了1个参数(user_input,),最终触发sqlite3.ProgrammingError绑定数量不匹配的错误。
修复方案(两种安全写法,避免SQL注入)
方案1:在Python层拼接通配符后传入参数
data = c.execute('''SELECT * FROM job WHERE title LIKE ?''', (f'%{user_input}%',)).fetchall()
方案2:用SQLite字符串拼接符||拼接通配符
data = c.execute('''SELECT * FROM job WHERE title LIKE '%' || ? || '%' ''', (user_input,)).fetchall()
注意:绝对不要直接将用户输入拼接到SQL语句中(比如
f"SELECT * FROM job WHERE title LIKE '%{user_input}%'"),这会引发严重的SQL注入风险。
内容的提问来源于stack exchange,提问作者hemoglobin
相关产品推荐
相关产品推荐

