2017-08-04 68 views
2

我試圖複製這種原始的SQL到適當的SQLAlchemy的實現,但很多的嘗試後,我無法找到一個妥善的辦法做到這一點: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

這些嘗試中有些不起作用的是什麼? – univerio

回答

2

您正在查詢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 ...)),但功能相同。

+0

這是完美的!非常感謝你,你是一個拯救生命的人。 –