列表如何确保每页返回pagesize个元素

61 阅读1分钟

问题背景:

前端需要分页展示列表信息,一般做法是按照前端约定的page 和pagesize 查询数据库,取出来pagesize个数据,然后根据数据库的信息比如ID去请求各种下游服务聚合各种返回的信息,如果某个必须展示的信息缺失,比如没有图片的话,就要过滤掉这条数据,这样返回给前端的列表个数就会少于pagesize,需要解决这个问题

解决:

因为不确认会有多少条元素缺失的情况,如果存在多个连续缺失的元素,而您希望每页返回的数量保持一致,可以使用循环来处理。

func getItems(pageNumber, pageSize int) ([]Item, error) {
    offset := (pageNumber - 1) * pageSize
    limit := pageSize + 1 // 获取多一个元素,用于判断是否有下一页

    var items []Item

    for len(items) < pageSize {
        // 执行查询,并使用 OFFSET 和 LIMIT 子句进行分页
        partialItems, err := db.Query("SELECT * FROM items OFFSET \$1 LIMIT \$2", offset, limit)
        if err != nil {
            return nil, err
        }
        
        //这里请求下游做各种信息聚合, 可能会过滤元素缺失的数据
        /* .......*/
        juheItems := juhefunc(partialItems)

        // 将聚合结果添加到 items 切片中
        items = append(items, juheItems...)

        // 如果查询结果数量少于 limit,说明已经没有更多数据了
        if len(partialItems) < limit {
            break
        }

        // 更新 offset,继续查询下一页
        offset += limit
    }

    return items[:pageSize], nil
}