如何使用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
相关产品推荐
相关产品推荐

