我正在寻找一种合适的方法来使用 row_number() 函数来制作 query.delete()。
下面是我目前的解决方案:
subquery = session.query(Foo,
func.row_number().over(order_by=desc(Foo.bar)).label("row_number")).subquery()
subquery = session.query(subquery).filter(subquery.c.row_number > 3)
subquery = subquery.from_self(Foo.id)
query = session.query(Foo).filter(
Foo.id.in_(subquery)
)
我不喜欢我需要明确检查 Foo.id 是否在 ID 列表中。我需要比较所有对象的列而不对它们进行硬编码。像这样的东西:
subquery = session.query(Foo,
func.row_number().over(order_by=desc(Foo.bar)).label("row_number")).subquery()
subquery = session.query(subquery).filter((subquery.c.row_number > 3))
subquery = subquery.from_self(Foo)
query = session.query(Foo).filter(
Foo.in_(subquery)
)
但这当然行不通。
如果有人提出解决方案,我将不胜感激。