gorm入门——如何实现分页查询

在 GORM 中,实现分页查询非常简单,你可以使用 LimitOffset 方法来控制查询结果的数量和起始位置。以下是如何实现分页查询的步骤:

分页查询的关键点

  • Limit(n): 设置返回的记录数量为 n
  • Offset(n): 设置查询的起始位置,跳过前 n 条记录。

示例代码

假设你有一个 User 结构体,并且希望实现分页查询。

package main

import (
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

type User struct {
    ID   uint
    Name string
    Age  int
}

func main() {
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic(err)
    }

    var users []User

    // 假设我们要查询第2页,每页10条记录
    page := 2
    pageSize := 10

    // 计算 Offset
    offset := (page - 1) * pageSize

    // 执行分页查询
    db.Limit(pageSize).Offset(offset).Find(&users)

    fmt.Println("Paged users:", users)
}

解释:

  1. Limit(pageSize): 限制返回的记录数量为 pageSize。在本例中,每页显示 10 条记录。

  2. Offset(offset): 设置查询的起始位置,跳过前 offset 条记录。在本例中,offset 计算为 (page - 1) * pageSize,也就是跳过前 10 条记录,查询从第 11 条记录开始。

  3. Find(&users): 执行查询,并将结果保存到 users 切片中。

总记录数查询

通常,在分页查询时你还需要知道总记录数以计算总页数,可以通过以下方式获取总记录数:

var totalCount int64
db.Model(&User{}).Count(&totalCount)

结合分页查询,你可以计算总页数:

totalPages := int(math.Ceil(float64(totalCount) / float64(pageSize)))

综合示例:

将分页查询和总记录数查询结合起来:

package main

import (
    "fmt"
    "math"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

type User struct {
    ID   uint
    Name string
    Age  int
}

func main() {
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic(err)
    }

    var users []User
    var totalCount int64

    page := 2
    pageSize := 10
    offset := (page - 1) * pageSize

    // 获取总记录数
    db.Model(&User{}).Count(&totalCount)

    // 执行分页查询
    db.Limit(pageSize).Offset(offset).Find(&users)

    // 计算总页数
    totalPages := int(math.Ceil(float64(totalCount) / float64(pageSize)))

    fmt.Println("Paged users:", users)
    fmt.Println("Total pages:", totalPages)
}

这个示例实现了分页查询,并计算了总页数。通过 LimitOffset,你可以轻松实现各种分页需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值