You need to enable JavaScript to run this app. 如何在Python的SQL查询中使用LIKE关键字及?通配符
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python的SQL查询中使用LIKE关键字及?通配符

Python 数据库查询中 LIKE 关键字与 ? 占位符使用指南

核心概念区分

很多使用场景下容易把两类功能完全不同的符号搞混,先明确边界:

  • SQL 模糊匹配通配符:是SQL语法本身的组成部分,配合LIKE关键字完成模糊匹配,常用的有%(匹配任意长度、任意内容的字符序列)、_(匹配单个任意字符)。SQL标准中不存在?作为模糊匹配通配符的用法。
  • Python DB API 规范的 ? 占位符:是数据库驱动约定的动态值标记,作用是在SQL语句中预留参数位置,由驱动自动完成参数转义,从根源上避免SQL注入风险,本身不属于SQL语法的一部分。

现有代码的问题定位

你当前编写的代码存在两处会导致执行失败的问题:

nome = "test"
cursor = db.execute("SELECT id FROM marca WHERE nome LIKE ?", ('%'+nome))
  1. 参数传递格式不符合驱动要求:execute方法要求传入的动态参数必须是元组、列表这类可迭代对象,当前你传入的'%'+nome是普通字符串,哪怕值已经拼好,驱动也无法正确解析占位符对应的参数,会抛出参数数量不匹配的报错
  2. 对占位符的作用边界理解偏差:?只负责标记参数位置,既不能当模糊匹配的通配符使用,也不支持在SQL字符串中给它额外拼接模糊符号(比如写成LIKE '%?'的形式),这种写法会让驱动把?识别成普通文本,完全丧失占位符的作用

正确使用规则

LIKE 关键字的使用逻辑

LIKE 关键字后需要接收一个带匹配规则的字符串,SQL会按照通配符规则逐位比对字段值:

  • 若要匹配字段值以指定内容开头,匹配规则为内容%
  • 若要匹配字段值包含指定内容,匹配规则为%内容%
  • 若要匹配字段值以指定内容结尾,匹配规则为%内容

? 占位符的使用规则

  • 所有动态传入的字段值、匹配规则值,都不要直接通过字符串拼接嵌入SQL语句,要统一通过占位符对应的参数序列传递
  • 当参数序列里只有单个参数时,必须把参数放在带尾随逗号的元组中,保证参数类型符合驱动要求

修正后的可运行示例

以sqlite3驱动(原生支持?占位符)为例,实现marca表名称字段的模糊匹配查询:

nome = "test"
# 先拼好带模糊匹配通配符的规则串,作为独立参数传递
match_rule = f"%{nome}%"
cursor = db.execute(
    "SELECT id FROM marca WHERE nome LIKE ?",
    (match_rule, )  # 单参数元组必须加尾随逗号
)

注意事项

  • 不同数据库驱动的占位符语法存在差异:比如MySQL官方驱动、PostgreSQL驱动默认不使用?作为占位符,需要对照驱动的规范替换为适配的占位标记,不要硬套?语法
  • 不要把模糊通配符拼到SQL语句的固定文本里,比如不要写"WHERE nome LIKE '%?'",这种写法会让占位符失效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 17:06:04