SQLite下SQLAlchemy LIKE筛选需改为区分大小写的技术求助
解决SQLAlchemy操作SQLite时LIKE区分大小写的问题
嘿,我之前也碰到过SQLite + SQLAlchemy里LIKE不区分大小写的问题,刚好能帮到你!SQLite 默认的 LIKE 操作之所以不区分大小写,是因为它的字符串列默认使用了 NOCASE 排序规则。要改成区分大小写的匹配,有两种简单直接的方法:
方法一:使用 COLLATE BINARY 强制区分大小写
这是最贴近你原有代码逻辑的方案,只需要在 current_value 字段后加上 collate('BINARY'),就能让 LIKE 匹配按照二进制编码区分大小写。
修改后的完整查询代码:
self.session.query(Value.scan).filter( Value.current_value.collate('BINARY').like(f"%{search}%"), Value.tag == Tag.tag, Tag.visible == True ).distinct().all()
这个方法不需要改变你的通配符使用习惯(依然用 %),非常省心。
方法二:用 SQLite 原生的 GLOB 操作符替代 LIKE
SQLite 的 GLOB 操作符天生就是区分大小写的,不过它的通配符规则和 LIKE 不一样:用 * 代替 % 表示任意字符,用 ? 代替 _ 表示单个字符。如果你的快速搜索逻辑就是“包含匹配”,直接把搜索模式改成 *{search}* 就行。
修改后的代码示例:
# 构建GLOB的匹配模式,这里直接用*做通配符实现包含搜索 glob_pattern = f"*{search}*" self.session.query(Value.scan).filter( Value.current_value.op('GLOB')(glob_pattern), Value.tag == Tag.tag, Tag.visible == True ).distinct().all()
注意:如果你的搜索输入里可能包含 * 或 ? 这类特殊字符,需要额外做转义处理,不过快速搜索栏的输入一般不会有这些,所以这个方案也很实用。
内容的提问来源于stack exchange,提问作者Lucie ouvrier-buffet
相关产品推荐
相关产品推荐

