我有此查询,以检查玩家是否在一个或另一列中
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'过滤器?
答案 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()
仅接受关键字参数并将其转换为相等表达式(==
)。