SQLAlchemy使用limit / offset返回意外结果

时间:2017-10-27 14:20:22

标签: python sqlalchemy

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

以下是一个示例查询:

result = session.query(A)\
.outerjoin(B)\
.outerjoin(C)\
.order_by(A.id)\
.offset(0).limit(100).all()

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

1 个答案:

答案 0 :(得分:1)

这就是SQL的工作原理。关于SQL语句中的操作顺序的This article可能是有意义的。您可以在子查询中进行偏移和限制,并加入该子查询。 Query.from_self()在这种特殊情况下很方便,特别是因为它会自动混叠:

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