在 sqlalchemy ORM 查询中使用 NOT EXISTS 子句

Posted

技术标签:

【中文标题】在 sqlalchemy ORM 查询中使用 NOT EXISTS 子句【英文标题】:Using NOT EXISTS clause in sqlalchemy ORM query 【发布时间】:2013-01-30 09:33:23 【问题描述】:

我想将以下原始 sql 查询转换为 sqlalchemy ORM 查询:

SELECT * FROM kwviolations AS kwviol WHERE kwviol.proj_id=1 AND NOT EXISTS (SELECT * FROM
kwmethodmetrics AS kwmetrics WHERE kwmetrics.kw_id=kwviol.kw_id AND kwmetrics.checkpoint_id=5);

我尝试了以下 ORM 查询但没有成功:

self.session.query(KWViolations).filter(KWViolations.proj_id==project.id).\
filter(and_(~KWViolations.kw_id.any(KWMethodMetrics.kw_id==KWViolations.kw_id),KWMethodMetrics.checkpoint_id==checkpoint.id))

有人可以帮忙吗? 提前致谢

【问题讨论】:

【参考方案1】:

kw_id 这里似乎是一个标量列值,所以你不能在上面调用any() - any() 只能从relationship() 绑定属性中获得。由于我在这里没有看到其中之一,您可以直接致电exists():

from sqlalchemy import exists

session.query(KWViolations).filter(KWViolations.proj_id == project.id).\
    filter(
        ~exists().where(
                and_(
                    KWMethodMetrics.kw_id == KWViolations.kw_id,
                    KWMethodMetrics.checkpoint_id == checkpoint.id
                )
        )
    )

【讨论】:

以上是关于在 sqlalchemy ORM 查询中使用 NOT EXISTS 子句的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有ORM的情况下使用SQLAlchemy查询从表中删除行?

SQLAlchemy-ORM

tornado 07 数据库—ORM—SQLAlchemy—查询

SQLAlchemy 将外连接 ORM 查询转换为 Core

SQLAlchemy Asyncio ORM 在从元数据中检索表和列时无法查询数据库

在SQLAlchemy ORM中动态变更表名