gin+gorm实现mysql分页查询

本文详细介绍了如何在Gin框架中利用GORM库进行MySQL数据库的分页查询,包括模型定义、数据库连接、分页参数处理和查询结果返回等步骤。
摘要由CSDN通过智能技术生成

在Gin框架中使用GORM进行MySQL分页查询

  1. 安装GORM

    go get -u gorm.io/gorm
    go get -u gorm.io/driver/mysql
    
  2. 定义模型
    定义一个Go结构体,它映射到MySQL数据库中的表。

    type Item struct {
        gorm.Model
        Name string
        // 其他字段...
    }
    
  3. 连接数据库
    在你的应用程序中连接到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{})
    }
    
  4. 实现分页查询
    创建一个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的LimitOffset方法来限制查询的结果集,并执行查询。接着,我们使用Count方法来获取总记录数,并计算总页数。最后,我们将查询结果和分页信息作为JSON响应返回给客户端。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值