在Gin框架中使用GORM进行MySQL分页查询
-
安装GORM:
go get -u gorm.io/gorm go get -u gorm.io/driver/mysql
-
定义模型:
定义一个Go结构体,它映射到MySQL数据库中的表。type Item struct { gorm.Model Name string // 其他字段... }
-
连接数据库:
在你的应用程序中连接到MySQL数据库。import ( "gorm.io/gorm" "gorm.io/driver/mysql" ) var db *gorm.DB var err error func init() { dsn := "username:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local" db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("failed to connect database") } // 自动迁移模式 db.AutoMigrate(&Item{}) }
-
实现分页查询:
创建一个Gin路由处理函数,使用GORM进行分页查询。type Pagination struct { Page int `form:"page" json:"page" uri:"page" binding:"required,min=1"` PageSize int `form:"page_size" json:"page_size" uri:"page_size" binding:"required,min=1,max=100"` } r := gin.Default() r.GET("/items", func(c *gin.Context) { var pagination Pagination if err := c.ShouldBindQuery(&pagination); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } var items []Item result := db.Limit(pagination.PageSize).Offset((pagination.Page - 1) * pagination.PageSize).Find(&items) if result.Error != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": result.Error.Error()}) return } totalRows := 0 db.Model(&Item{}).Count(&totalRows) totalPages := int(math.Ceil(float64(totalRows) / float64(pagination.PageSize))) c.JSON(http.StatusOK, gin.H{ "items": items, "total_items": totalRows, "page": pagination.Page, "page_size": pagination.PageSize, "total_pages": totalPages, }) }) func main() { r.Run() // listen and serve on 0.0.0.0:8080 }
在这个例子中,定义了一个Pagination
结构体来存储分页参数,并在/items
路由中使用ShouldBindQuery
方法从查询字符串中获取这些参数。然后,使用GORM的Limit
和Offset
方法来限制查询的结果集,并执行查询。接着,我们使用Count
方法来获取总记录数,并计算总页数。最后,我们将查询结果和分页信息作为JSON响应返回给客户端。