子选择中不存在 SQLAlchemy?

Edg*_*tro 5 python sqlite sqlalchemy

我正在尝试将此原始 sql 复制到正确的 sqlalchemy 实现中,但经过多次尝试后,我找不到合适的方法来做到这一点:

SELECT *
FROM images i
WHERE NOT EXISTS (
    SELECT image_id
    FROM events e
    WHERE e.image_id=i.id AND e.chat_id=:chat_id)
ORDER BY random()
LIMIT 1
Run Code Online (Sandbox Code Playgroud)

我得到的最接近的是:

session.query(Image).filter(and_(Event.image_id == Image.id, Event.chat_id == chat_id)).order_by(func.random()).limit(1)
Run Code Online (Sandbox Code Playgroud)

但我似乎无法找到如何放置 NOT EXISTS 子句。

任何人都可以伸出援助之手吗?

谢谢!

uni*_*rio 11

您正在查询该FROM images表,但该WHERE子句是一个子查询,而不是e.image_id=i.id AND e.chat_id=:chat_id(这些过滤器用于events替代)。所以,正确的查询是这样的形式

session.query(Image).filter(subquery).order_by(func.random()).limit(1)
Run Code Online (Sandbox Code Playgroud)

形成EXISTS子查询的.exists()方法是使用方法,因此NOT EXISTS只需使用~运算符:

subquery = ~session.query(Event).filter(Event.image_id == Image.id, Event.chat_id == chat_id).exists()
Run Code Online (Sandbox Code Playgroud)

请注意,发出的查询与您的原始查询不同(例如,它使用EXISTS (SELECT 1 ...)),但在功能上是相同的。