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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:10:24