如何在SQLAlchemy中编写嵌套连词(OR和AND子句)?

时间:2014-09-22 23:57:15

标签: python sql sqlalchemy

有人知道如何在SQLAlchemy中生成嵌套连词吗?

我有一些类似的Python代码:

import sqlalchemy as sa

a = sa.and_(mytable.col1 > 1, mytable.col2 < 3)
b = sa.and_(mytable.col1 < 1, mytable.col4 == None)
clause_args = [a, b] 
or_clauses = sa.or_(*clause_args)
session.query(mytable).filter(mytable.status.in_([1,2,3,4])).filter(or_clauses)

注意,这只是一些伪代码来演示我遇到的语法问题。 不要过多地分析查询逻辑。我只是想找到一种方法如何在AND和OR块周围添加括号。 SQLAlchemy生成类似于SQL的SQL:

SELECT
     id, status, name, col1, col2, col3, col4
FROM mytable
WHERE
    status in (1,2,3,4)
AND (col1 > 1 
     AND col2 < 3
     OR col1 < 1
     AND col4 is NULL);

注意,AND条件在OR之间的逻辑AND块周围没有括号:

AND (col1 > 1 
     AND col2 < 3
     OR col1 < 1
     AND col4 is NULL);

我想强制在过滤器中使用带有or_和and_连词的括号。 我想括起来条件,以便SQL输出如下所示:

SELECT
     id, status, name, col1, col2, col3, col4
FROM mytable
WHERE
    status in (1,2,3,4)
AND ((col1 > 1 
     AND col2 < 3)
     OR (col1 < 1
     AND col4 is NULL));

有人可以建议如何实现这个目标吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

使用self_group()。文档链接:self_group

示例的解决方案类似于

import sqlalchemy as sa

a = sa.and_(mytable.col1 > 1, mytable.col2 < 3).self_group()
b = sa.and_(mytable.col1 < 1, mytable.col4 == None).self_group()
clause_args = [a, b] 
or_clauses = sa.or_(*clause_args)
session.query(mytable).filter(mytable.status.in_([1,2,3,4])).filter(or_clauses)

答案 1 :(得分:0)

IIUC,不需要您正在寻找的括号,因为AND优先于OR。