首页 > 解决方案 > 如何使用 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 和核心中执行此查询的正确方法是什么?

标签: pythonsqlsqlitesqlalchemy

解决方案


一种方法是形成一个针对关键字列表进行测试的 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 集成不是很简单,但可行


推荐阅读