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

如何使用SQLAlchemy查询SQLite中token列值为指定字符串子串的行?

问题描述

我正在使用SQLAlchemy连接存储单词的SQLite数据库,希望检索出所有token列的值为字符串myToken子串的行。对应的模型类如下:

class Word(Base):
    id = Column(Integer, primary_key=True)
    token = Column(String)

示例结果如下:

myToken = "alpha"

result = ["lph", "alp",]

我尝试了多种方法,部分示例如下,但返回结果均为None:

尝试1

res = session.query(Word).where(str(Word.token) in myToken).first()

Result: None

尝试2

res = session.query(Word).filter(myToken.contains(str(Word.token))).first()

Result: None

尝试3

res = session.query(Word).where(Word.token.like(myToken)).first()

Result: None

尝试4

res = session.query(Word).filter(or_(
      Word.token.like('%' + myToken),
      Word.token.like(myToken + '%'),
      Word.token == myToken,
)).first()

Result: None

解决方案

你之前的问题核心是逻辑搞反了:需要判断的是**myToken包含Word.token的值**,而非Word.token包含myToken。针对SQLite,有两种可靠实现方式:

方法1:使用SQLite内置instr函数

利用instr函数返回子串在字符串中的起始位置(不存在则返回0),只需判断返回值大于0即可:

from sqlalchemy import func

myToken = "alpha"
# 查询所有符合条件的行
results = session.query(Word).filter(func.instr(myToken, Word.token) > 0).all()
# 提取token值组成目标列表
result_tokens = [word.token for word in results]

方法2:使用literal构建反向包含判断

通过literal将myToken转为SQL字面量,再调用contains方法匹配Word.token:

from sqlalchemy import literal

myToken = "alpha"
results = session.query(Word).filter(literal(myToken).contains(Word.token)).all()
result_tokens = [word.token for word in results]

错误原因说明

  • 你之前用str(Word.token)会把列对象转成字符串表示(比如'Word.token'),而非数据库中的实际值,导致生成的SQL完全错误。
  • like相关的写法逻辑完全倒置,原本是要检查myToken是否包含token,你却写成了token匹配myToken的前后通配情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:00:49