在开发Web应用时,我们经常需要从数据库中获取大量数据。如果一次性加载所有数据,不仅会消耗大量内存,还会导致页面加载缓慢。这时,分页(Pagination)就显得尤为重要。本文将手把手教你如何在Go语言中使用GORM框架实现优雅、高效的分页查询,即使是编程新手也能轻松上手!
GORM 是 Go 语言中最受欢迎的 ORM(对象关系映射)库之一。它支持多种数据库(如 MySQL、PostgreSQL、SQLite 等),并提供了简洁的 API 来操作数据库,让开发者无需编写复杂的 SQL 语句。
分页的核心思想是:只查询当前页所需的数据。通常需要两个参数:
例如:第2页,每页10条,则跳过前10条,取第11~20条数据。
下面我们通过一个完整的例子来演示如何在 GORM 中实现分页。
type User struct { ID uint `gorm:"primaryKey"` Name string Age int} 我们可以封装一个通用的分页函数,适用于任何模型:
func Paginate[T any](db *gorm.DB, page, pageSize int) (*gorm.DB, int64) { var total int64 db.Model(new(T)).Count(&total) offset := (page - 1) * pageSize db = db.Offset(offset).Limit(pageSize) return db, total} // 假设 page=2, pageSize=10var users []Userpage := 2pageSize := 10db, total := Paginate[User](gormDB, page, pageSize)result := db.Find(&users)if result.Error != nil { // 处理错误}// total 是总记录数,可用于前端计算总页数fmt.Printf("共 %d 条记录,当前页有 %d 条\n", total, len(users)) package mainimport ( "fmt" "gorm.io/driver/sqlite" "gorm.io/gorm")type User struct { ID uint `gorm:"primaryKey"` Name string Age int}func Paginate[T any](db *gorm.DB, page, pageSize int) (*gorm.DB, int64) { var total int64 db.Model(new(T)).Count(&total) offset := (page - 1) * pageSize db = db.Offset(offset).Limit(pageSize) return db, total}func main() { db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) if err != nil { panic("failed to connect database") } db.AutoMigrate(&User{}) // 插入一些测试数据 for i := 1; i <= 25; i++ { db.Create(&User{Name: fmt.Sprintf("User%d", i), Age: 20 + i%10}) } // 分页查询 var users []User page := 2 pageSize := 10 db, total := Paginate[User](db, page, pageSize) db.Find(&users) fmt.Printf("总记录数: %d\n", total) fmt.Printf("当前页数据: %+v\n", users)} 本文详细介绍了 GORM分页查询 的实现方法,涵盖了 Golang数据库分页 的核心逻辑,并提供了完整的 Go语言GORM教程 示例。无论你是初学者还是有经验的开发者,都能掌握这种高效的 分页实现方法。
page 和 pageSize 做合法性校验(如不能为负数,pageSize 不宜过大)。Scopes 功能也可以用于封装分页逻辑,使代码更简洁。现在你已经掌握了在 Go 语言中使用 GORM 实现分页查询的全部技巧!快去你的项目中试试吧!
本文由主机测评网于2025-12-17发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025128896.html