首页 > 解决方案 > 是否可以在 filter_by 之间使用 or_

问题描述

我有这个查询,检查玩家是否在一个或另一列

SELECT event_id
FROM schedule
WHERE player1 = 1 and player2 = 2 or player1 = 2 and player2 = 1

这工作正常,但是我需要在 SQLAlchemy 中编写它,所以我想出了以下内容:

check_events = db.session.query(Schedule.event_id).filter(and_(Schedule.player1==form.player1.data, Schedule.player2==form.player2.data)).filter(and_(Schedule.player1==form.player2.data, Schedule.player2==form.player1.data))

问题是当我使用另一个过滤器filter_by时,结果查询将使用AND而不是OR运算符

SELECT "Schedule".event_id AS "Schedule_event_id"
FROM "Schedule"
WHERE "Schedule".player1 = ? AND "Schedule".player2 = ? AND "Schedule".player1 = ? AND "Schedule".player2 = ?

我也觉得我最初的查询可能很丑陋,并且可以以不同的方式完成。尽管如此,是否可以使用or_ 'between' 过滤器?

标签: pythonsqlalchemy

解决方案


您想组合or_并将and_结果传递给单个filter(). 例如:

from sqlalchemy import and_, or_

(
    db.session.query(Schedule.event_id)
    .filter(
        or_(
            and_(
                Schedule.player1 == form.player1.data,
                Schedule.player2 == form.player2.data,
            ),
            and_(
                Schedule.player2 == form.player1.data,
                Schedule.player1 == form.player2.data,
            ),
        )
    )
)

这些类型的表达式只能传递给Query.filter(). Query.filter_by()只接受关键字参数并将它们转换为等式表达式 ( ==)。


推荐阅读