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

4

我有一个查询,它执行多个左联接,然后执行限制/偏移以进行分页。我的问题是,限制/偏移似乎是应用于在执行所有联接之后返回的行数。我希望限制/偏移应用于我从查询中获取的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个回答

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()

您可以更详细地解释这个案例,以便更好地理解。 - alhelal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接