有人知道如何在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));
有人可以建议如何实现这个目标吗?
谢谢!
答案 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。