我试图将这个原始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条款。
任何人都可以伸出援助之手吗?
谢谢!
答案 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 ...)
),但功能相同。