SQLAlchemy在子查询中不存在?

6

我正在尝试将这个原始的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

我最接近的结果是:

session.query(Image).filter(and_(Event.image_id == Image.id, Event.chat_id == chat_id)).order_by(func.random()).limit(1)

但我似乎找不到如何使用NOT EXISTS子句。

有人能帮个忙吗?

谢谢!


这些尝试中有哪些是失败的? - univerio
1个回答

14

您正在查询 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)

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

subquery = ~session.query(Event).filter(Event.image_id == Image.id, Event.chat_id == chat_id).exists()

请注意,生成的查询语句与您的原始查询语句并不完全相同(例如,它使用EXISTS (SELECT 1 ...)),但其功能是相同的。


太好了!非常感谢你,你是我的救星。 - Edgard Castro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接