是否可以在filter_by之间使用or_

时间:2019-08-30 12:34:38

标签: python sqlalchemy

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

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 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'过滤器?

1 个答案:

答案 0 :(得分:1)

您要组合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()仅接受关键字参数并将其转换为相等表达式(==)。