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 ...)),但在功能上是相同的。
| 归档时间: |
|
| 查看次数: |
2962 次 |
| 最近记录: |