Flask-SQLAlchemy的可变参数'OR'查询

2 投票
1 回答
3110 浏览
提问于 2025-04-18 18:14

我有一个高级搜索界面,可以把键值对发送到我的flask应用程序。这里的“键”是指要搜索的表格中的列,而“值”则是要用来比较的条件。

下面是一个查询的例子,假设k是“项目”表中的“标签”列,v是要搜索的标签。

projects = Projects.query.filter(getattr(Projects, k).like('%{}%'.format(v)))

如果用户提交了两个标签来进行搜索,那么v就会是这两个标签的列表。接下来,我可以这样查询数据库:

if len(v) == 2:
    v1, v2 = v[0], v[1]
    projects = Projects.query.filter(or_(
        getattr(Projects, k).like('%{}%'.format(v1)),
        getattr(Projects, k).like('%{}%'.format(v2)))
    )

有没有更好的方法来执行“或”查询呢?在这个例子中,标签的数量是可变的。

我该怎么写代码才能处理2个标签或者10个标签呢?

1 个回答

6

你可以用 * 展开来传递任意数量的参数给 or_

or_filters = [getattr(Projects, k).like('%{}%'.format(term)) for term in v]
projects = Projects.query.filter(or_(*or_filters))

要记住,在 SQL 查询中使用大量的 LIKE 查找通常效率不高。

撰写回答