如何在Peewee中实现反向包含查询:判断Album为给定字符串子串
问题
我有一个基于SQLite3的Music数据库,其中包含名为Album的字段。需要查询所有Album字段值是给定字符串str的子串的行(而非常规的str是Album的子串)。
目前仅能实现后者的查询:
# 此代码可行:查询str是Album子串的行 q_str='anthem for the ' query=Music.select().where((Music.ALBUMARTIST == album_artist) & (Music.ALBUM.contains(qstr)) )
但我的场景中q_str类似'anthem for the underdog (bonus track version)',需要返回Album值为'anthem for the underdog'的行。尝试用is_in方法但它仅支持列表,不符合需求:
# 期望返回Album为'anthem for the underdog'的行,但此代码无效 q_str='anthem for the underdog (bonus track version)' query=Music.select().where((Music.ALBUMARTIST == album_artist) & (Music.ALBUM.is_in(qstr)) )
解决方案
要实现“Album是q_str的子串”的查询,可借助SQLite的INSTR函数(返回子串在字符串中的起始位置,不存在则返回0),通过Peewee的fn模块调用该函数:
from peewee import fn q_str='anthem for the underdog (bonus track version)' # 核心逻辑:判断Album是否是q_str的子串,即INSTR(q_str, Album) > 0 query = Music.select().where( (Music.ALBUMARTIST == album_artist) & (fn.INSTR(q_str, Music.ALBUM) > 0) )
也可以用SQL的LIKE语法实现,效果一致:
query = Music.select().where( (Music.ALBUMARTIST == album_artist) & (q_str.contains(Music.ALBUM)) # 等价于 q_str LIKE '%' || Music.ALBUM || '%' )
说明
is_in方法的作用是判断字段值是否在给定的列表/集合中,和子串匹配逻辑完全无关,因此不适用。- 上述两种方式本质都是生成SQL语句,让数据库判断
Album是否是q_str的子串,符合查询需求。
内容的提问来源于stack exchange,提问作者RuMAN S
相关产品推荐
相关产品推荐

