带括号的 SQLAlchemy 连词

Posted

技术标签:

【中文标题】带括号的 SQLAlchemy 连词【英文标题】:SQLAlchemy Conjunction with Parentheses 【发布时间】:2015-07-08 03:56:02 【问题描述】:

我正在尝试在 sqlalchemy 核心中生成以下 sql。我无法让连词 AND OR 中的括号出现。

select from member t1 
inner join member t2 
 on (
        (
          t1.first_name = t2.last_name and 
          t1.last_name = t2.first_name and 
          t1.dob = t2.dob
        )
        or (
             t1.last_name = t2.last_name and 
             t1.first_name = t2.first_name and 
             t1.dob = t2.dob
           )
    )
group by t2.id

我正在使用的 sqlalchemy 核心语句是:

selStmt = select([t1]).select_from(
    t1.join(
            t2, or_(
                    and_(
                         t1.c.first_name == t2.c.last_name,
                         t1.c.last_name == t2.c.first_name,
                         t1.c.dob == t2.c.dob
                         ),
                    and_(
                         t1.c.last_name == t2.c.last_name,
                         t1.c.first_name == t2.c.first_name,
                         t1.c.dob == t2.c.dob
                         )
                    )
            )
        ).group_by(t2.c.id)

生成的sql代码为:

SELECT t1
    FROM t1 
    JOIN t2 ON 
        t1.first_name = t2.last_name AND 
        t1.last_name = t2.first_name AND 
        t1.dob = t2.dob OR 
        t1.last_name = t2.last_name AND 
        t1.first_name = t2.first_name AND 
        t1.dob = t2.dob 
    GROUP BY t2.id

由于括号不包括在内,逻辑不正确。如何在连词中获得括号?

【问题讨论】:

逻辑正确,and 的优先级高于or 【参考方案1】:

显然,AND 操作的优先级高于 OR。因此,在我的情况下,括号不是必需的。

【讨论】:

以上是关于带括号的 SQLAlchemy 连词的主要内容,如果未能解决你的问题,请参考以下文章

sqlalchemy 简单使用

初学flask_sqlalchemy

使用 sqlalchemy 实现“软删除”系统

python SQLAlchemy

flask 使用 SQLAlchemy 的两种方式

Flask-SQLAlchemy 中的 LocalProxy 对象