go gorm 分页查询

使用 Gorm 实现分页功能

  1. 工具函数
    我们首先定义一个通用的 Paging 函数和结构体,用于处理分页逻辑:

  2. type PagingParams struct {
    	Page  int `json:"page"`
    	Limit int `json:"limit"`
    }
    
    type PagingResponse struct {
    	Total int64
    	List  interface{}
    }
    
  3. // Paging 分页 page=0时查询全部
    func Paging(model interface{}, sql *gorm.DB, pagingParams models.PagingParams) (models.PagingResponse, error) {
    	var total int64
    
    	if err := sql.Count(&total).Error; err != nil {
    		return models.PagingResponse{}, err
    	}
    	if pagingParams.Page == 0 {
    		sql.Find(&model)
    		if isEmpty(model) {
    			model = []interface{}{}
    		}
    		res := models.PagingResponse{
    			Total: total,
    			List:  model,
    		}
    		return res, nil
    	}
    	if err := sql.Limit(pagingParams.Limit).Offset((pagingParams.Page - 1) * pagingParams.Limit).Find(&model).Error; err != nil {
    		return models.PagingResponse{}, err
    	}
    	if isEmpty(model) {
    		model = []interface{}{}
    	}
    	res := models.PagingResponse{
    		Total: total,
    		List:  model,
    	}
    	return res, nil
    }
    
  4. 结构体与使用方法

    接下来,我们定义一个获取分类的接口,示例代码如下:

    type GetRecordsRequest struct {
    	models.PagingParams
    	ID         uint      `json:"id"`
    	UserID     uint      `json:"userId"`     //用户ID 管理员可以查询
    	CategoryID uint      `json:"categoryId"` //分类ID
    	Keyword    string    `json:"keyword"`    //关键字
    	Date       time.Time `json:"date"`       //时间
    }
    
    // GetRecords 获取记录
    //
    //	@Summary	获取记录
    //	@Tags		记录
    //	@Accept		json
    //	@Produce	json
    //	@Param		body	body		GetRecordsRequest	true	"Request body"
    //	@Success	200		{object}	models.PagingResponse
    //	@Router		/api/v1/record/GetRecords [post]
    func GetRecords(c *gin.Context) {
    	var req GetRecordsRequest
    	if err := c.ShouldBindJSON(&req); err != nil {
    		response.FailWithInvalidArgs(c, err.Error())
    		return
    	}
    	sql := core.DB.Where("user_id = ?", utils.GetUserID(c))
    	if req.ID != 0 {
    		sql = sql.Where("id = ?", req.ID)
    	}
    	if req.UserID != 0 {
    		sql = sql.Where("user_id = ?", req.UserID)
    	}
    	if req.CategoryID != 0 {
    		sql = sql.Where("category_id = ?", req.CategoryID)
    	}
    	if req.Keyword != "" {
    		sql = sql.Where("name LIKE ? OR description LIKE ?", "%"+req.Keyword+"%", "%"+req.Keyword+"%")
    	}
    
    	res, err := utils.Paging(models.Record{}, sql, req.PagingParams)
    	if err != nil {
    		response.FailWithData(c, err.Error())
    		return
    	}
    	response.OkWithData(c, res)
    }
    
### 使用 GORM 和 Gin 实现分页查询 为了实现分页查询,可以利用 `jinzhu/gorm` 提供的强大功能以及 `gin-gonic/gin` 的简洁路由处理机制。下面是一个完整的例子来展示如何创建一个分页接口。 #### 创建模型结构体 首先定义要操作的数据表对应的 Go 结构体: ```go type User struct { ID uint `json:"id"` Name string `json:"name"` } ``` #### 编写控制器逻辑 编写用于获取分页数据的处理器函数,在此过程中会涉及到计算偏移量并调用数据库查询方法: ```go func GetUsers(c *gin.Context) { var users []User page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "10")) offset := (page - 1) * pageSize result := db.Offset(offset).Limit(pageSize).Find(&users) c.JSON(http.StatusOK, gin.H{ "total": result.RowsAffected, "data": users, }) } ``` 上述代码片段展示了通过 URL 参数接收当前页面编号 (`page`) 及每页显示条目数 (`pageSize`) 来动态调整 SQL 查询中的 OFFSET 和 LIMIT 值[^1]。 #### 设置路由映射 最后一步是在应用启动时注册该 API 路由: ```go r.GET("/api/users", controllers.GetUsers) ``` 这使得当访问 `/api/users?page=2&pageSize=5` 这样的路径时就能触发相应的业务逻辑执行,并返回指定范围内的记录列表给客户端[^2]。 对于更复杂的场景下可能还需要考虑排序、过滤等功能的支持;另外值得注意的是实际项目中应当加入更多的错误处理以提高系统的健壮性和用户体验[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值