SQLAlchemy 返回带有限制/偏移量的意外结果

zch*_*odd 4 python sqlalchemy

我有一个查询执行多个左连接,然后执行限制/偏移以实现分页目的。我的问题是,限制/偏移量似乎应用于执行所有联接后返回的总行数。我想要的是将限制/偏移应用于从查询返回的 ORM 实例的数量。

这是一个示例查询:

result = session.query(A)\
.outerjoin(B)\
.outerjoin(C)\
.order_by(A.id)\
.offset(0).limit(100).all()
Run Code Online (Sandbox Code Playgroud)

因此,如果 A 通过连接表 B 与 C 具有一对多关系,我可能会在 A 中每行获得 N 行。是否需要做一些特殊的事情,以便将限制/偏移应用于 A 实例的计数,而不是连接产生了多少行?

Ilj*_*ilä 7

这就是 SQL 的工作原理。这篇有关 SQL 语句中的操作顺序的文章可能会引起您的兴趣。您可以在子查询中进行偏移和限制,然后对其进行连接。Query.from_self()在这种特殊情况下很方便,特别是因为它可以自动别名:

result = session.query(A)\
    .order_by(A.id)\
    .offset(0).limit(100)\
    .from_self()\
    .outerjoin(B)\
    .outerjoin(C)\
    .all()
Run Code Online (Sandbox Code Playgroud)