python - 如何使用 sqlalchemy orm 和 core 查询带有关键字列表的字符串列?
问题描述
class Message(Base):
__tablename__ = 'message'
id = Column(Integer, primary_key=True)
content = Column(Text)
def __repr__(self):
return f'<{self.__class__.__name__}({self.id}, {self.content})>'
message.content
是句子记录,即长字符串。如何查询包含关键字列表中任何元素的记录?
例如,假设msg
记录和列表keywords
如下:
'Chris likes Tea and orange', 'Bob likes Coffee and apple', 'Alice likes Tea too'
keywords = ['Tea', 'orange']
然后它返回
['Chris likes Tea and orange', 'Alice likes Tea too']
在 SQLalchemy ORM 和核心中执行此查询的正确方法是什么?
解决方案
一种方法是形成一个针对关键字列表进行测试的 EXISTS 子查询表达式:
import json
from sqlalchemy import column, exists, func, select
# json_each is a TVF, table valued function
kws = func.json_each(json.dumps(keywords)).alias()
kws = select([column("value")]).select_from(kws).cte()
session.query(Message).\
filter(exists().
where(Message.content.contains(kws.c.value)).
correlate(Message))
如果您需要搜索一个大表,您可能对 FTS5 感兴趣。将它与 SQLAlchemy 集成不是很简单,但可行。