SQLAlchemy不存在于subselect中?

时间:2017-08-04 14:40:11

标签: 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

我得到的最近的是:

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

但我似乎无法找到如何放置NOT EXISTS条款。

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

谢谢!

1 个答案:

答案 0 :(得分:4)

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

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

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

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