Python 如何在SQLAlchemy中编写嵌套连词(或and子句)?

Python 如何在SQLAlchemy中编写嵌套连词(或and子句)?,python,sql,sqlalchemy,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(my

有人知道如何在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)
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);
将sqlalchemy作为sa导入
a=sa.和(mytable.col1>1,mytable.col2<3)
b=sa.和(mytable.col1<1,mytable.col4==None)
子句_args=[a,b]
or_子句=sa.或(*子句参数)
session.query(mytable).filter(mytable.status.in.[1,2,3,4]).filter(或\u子句)
请注意,这只是一些伪代码来演示我遇到的语法问题。 不要过多地分析查询逻辑。我只是想找到一种在AND或块周围添加括号的方法。 SQLAlchemy生成的SQL与此类似:

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)
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);
选择
id、状态、名称、col1、col2、col3、col4
从mytable
哪里
(1,2,3,4)中的状态
和(col1>1)
col2<3
或col1<1
col4为空);
注意,AND条件在OR之间的逻辑AND块周围没有括号:

AND (col1 > 1 
     AND col2 < 3
     OR col1 < 1
     AND col4 is NULL);
和(col1>1)
col2<3
或col1<1
col4为空);
我想强制在过滤器中使用括号和或和连接词。 我想用括号括起条件,以便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));
选择
id、状态、名称、col1、col2、col3、col4
从mytable
哪里
(1,2,3,4)中的状态
和((col1>1)
和col2<3)
或(col1<1
col4为NULL);
有人能建议如何做到这一点吗


谢谢大家!

IIUC,您正在查找的括号不需要,因为它优先于或。

使用self\u 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)
将sqlalchemy作为sa导入
a=sa.和(mytable.col1>1,mytable.col2<3).self_组()
b=sa.和(mytable.col1<1,mytable.col4==None).self\u组()
子句_args=[a,b]
or_子句=sa.或(*子句参数)
session.query(mytable).filter(mytable.status.in.[1,2,3,4]).filter(或\u子句)

看看这里:链接到的同一文档明确指出:根据我的经验,自组行为的应用不一致-例如,在SQLAlchemy 1.3.16上,我可以通过在
块中包装一系列
块来触发该行为。通过
self\u group()
强制行为可以很好地断言条件,无论解析器将来如何调整自己的行为。这是一个轶事,但当这个“自动”应用程序停止自动运行时,它导致了一些非常微妙的查询错误。