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

21 投票
1 回答
17862 浏览
提问于 2025-04-17 14:10

我想把下面这个原始的 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 个回答

32

这里的 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
                )
        )
    )

撰写回答