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

如何为带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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:12:00