sqlalchemy如何在OR操作中使用AND?

10 投票
1 回答
18611 浏览
提问于 2025-04-17 17:57

我需要执行这个查询:

SELECT *
FROM tbl_member
WHERE (member_type==1 AND member_status==1)
   OR (member_type==2 and member_status==2)

我试过:

q=session.query(tbl_member) \
  .filter(or_(and_(tbl_member.member_type==1,tbl_member.member_status==1), \
              and_(tbl_member.member_type==2,tbl_member.member_status==2)))

还有

q=session.query(tbl_member) \ 
  .filter(or_((and_(tbl_member.member_type==1,tbl_member.member_status==1)), \
              (and_(tbl_member.member_type==2,tbl_member.member_status==2))))

但是查询的SQL还是这样:

SELECT *
FROM tbl_member
WHERE member_type==1 AND member_status==1 OR member_type==2 AND member_status==2

我该怎么做呢?

1 个回答

10

这个查询在语义上是一样的,因为在逻辑运算中,AND的优先级高于OR。所以,
WHERE Cond1 AND Cond2 OR Cond3 AND Cond4
WHERE (Cond1 AND Cond2) OR (Cond3 AND Cond4) 产生的结果是一样的。

如果你反过来试试(在你的代码中把or_and_调换),你会发现sqlalchemy确实会生成括号。

撰写回答