如何为带LIKE、ORDER BY的SQL编写正确的Python预编译语句?
预编译LIKE查询与动态排序的正确写法
报错核心原因
你写的改写代码有两个核心错误:
- SQL语法不符合规范:不需要在
LIKE、ORDER BY子句中加(pattern = %s)这类多余的判断结构,预编译占位符直接替代对应动态值的位置即可。 - 预编译参数仅支持传递查询值,不支持传递SQL语法片段:排序方向
order_by属于SQL语法结构的一部分,无法通过预编译占位符传递,必须先做白名单校验后再拼接进SQL语句。
正确实现代码
# 第一步:校验动态排序参数的合法性,避免SQL注入风险 allowed_order_directions = ["ASC", "DESC"] order_by = order_by.strip().upper() if order_by not in allowed_order_directions: order_by = "DESC" # 不合法则取默认排序方向 # 第二步:构造LIKE匹配的模糊查询pattern search_pattern = f"%{search_title}%" # 第三步:执行预编译查询 articles = db.execute( f"SELECT * FROM article WHERE title LIKE %s ORDER BY created_at {order_by}", (search_pattern,) )
注意事项
- 不同数据库驱动的预编译占位符存在差异:MySQL/PgSQL驱动常用
%s,SQLite驱动常用?,需要根据你使用的数据库适配调整。 - 所有用户可控的查询值(比如搜索关键词
search_title)必须通过预编译参数传递,禁止直接拼接进SQL语句,避免SQL注入风险。 - 所有动态的SQL语法部分(比如排序方向、排序字段、表名、查询字段名)必须先做严格的白名单校验,仅允许预设的合法值使用,禁止直接拼接用户输入的内容。
内容的提问来源于stack exchange,提问作者Steagee
相关产品推荐
相关产品推荐

