gorm入门——如何实现分页查询
在 GORM 中,实现分页查询非常简单,你可以使用 Limit
和 Offset
方法来控制查询结果的数量和起始位置。以下是如何实现分页查询的步骤:
分页查询的关键点
Limit(n)
: 设置返回的记录数量为n
。Offset(n)
: 设置查询的起始位置,跳过前n
条记录。
示例代码
假设你有一个 User
结构体,并且希望实现分页查询。
package mainimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm"
)type User struct {ID uintName stringAge 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 := 2pageSize := 10// 计算 Offsetoffset := (page - 1) * pageSize// 执行分页查询db.Limit(pageSize).Offset(offset).Find(&users)fmt.Println("Paged users:", users)
}
解释:
-
Limit(pageSize)
: 限制返回的记录数量为pageSize
。在本例中,每页显示10
条记录。 -
Offset(offset)
: 设置查询的起始位置,跳过前offset
条记录。在本例中,offset
计算为(page - 1) * pageSize
,也就是跳过前10
条记录,查询从第11
条记录开始。 -
Find(&users)
: 执行查询,并将结果保存到users
切片中。
总记录数查询
通常,在分页查询时你还需要知道总记录数以计算总页数,可以通过以下方式获取总记录数:
var totalCount int64
db.Model(&User{}).Count(&totalCount)
结合分页查询,你可以计算总页数:
totalPages := int(math.Ceil(float64(totalCount) / float64(pageSize)))
综合示例:
将分页查询和总记录数查询结合起来:
package mainimport ("fmt""math""gorm.io/driver/mysql""gorm.io/gorm"
)type User struct {ID uintName stringAge 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 []Uservar totalCount int64page := 2pageSize := 10offset := (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)
}
这个示例实现了分页查询,并计算了总页数。通过 Limit
和 Offset
,你可以轻松实现各种分页需求。