如何在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))
- 参数传递格式不符合驱动要求:
execute方法要求传入的动态参数必须是元组、列表这类可迭代对象,当前你传入的'%'+nome是普通字符串,哪怕值已经拼好,驱动也无法正确解析占位符对应的参数,会抛出参数数量不匹配的报错 - 对占位符的作用边界理解偏差:
?只负责标记参数位置,既不能当模糊匹配的通配符使用,也不支持在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
相关产品推荐
相关产品推荐

