goland 项目GORM 中dao.db.Find 和 dao.db.Model 有什么区别?

序言:

我们在初次学习goLand是可能会遇到查询数据分页,在分页过程会计算查询出来的条数。这个过程会用到dao.db.Finddao.db.Model,那么他们之间到底啥关系要怎么使用呢?

目录

一、dao.db.Find

二、dao.db.Model

三、运用

说明

四、总结:


一、dao.db.Find

        在 GORM 中,dao.db.Finddao.db.Model 有不同的用途和上下文,理解它们的区别对于有效使用 GORM 非常重要。

  • 用途:用于直接查询并返回结果集。

  • 上下文:适用于已经有了模型类型的上下文,通常在查询所有记录或符合某个条件的记录时使用。

例如:

var users []User
err := dao.db.Find(&users).Error

这行代码会查询 User 表中的所有记录,并将结果填充到 users 切片中。

二、dao.db.Model

  • 用途:用于创建查询的上下文,通常与链式查询结合使用,尤其是需要在查询中使用条件(例如 CountSelectWhere 等)时。

  • 上下文:可以在 Model 中指定一个模型,并在此基础上进行进一步的查询操作,比如获取总记录数或应用条件。

例如 :

var total int64
err := dao.db.Model(&User{}).Count(&total).Error

三、运用

使用三层架构编码方式controller层、service层和dao层需要进行分页请求示例:

3.1 dao层中调用:

UserDAO 中添加 pagepageSize 参数,并在查询时应用这些参数。

// GetAllUsers 获取所有用户,支持分页
func (dao *UserDAO) GetAllUsers(page, pageSize int) ([]entity.User, int64, error) {
    var users []entity.User
    var total int64

    // 先获取总记录数
    if err := dao.db.Model(&entity.User{}).Count(&total).Error; err != nil {
        log.Printf("Failed to count users: %v", err)
        return nil, 0, err
    }

    // 使用 GORM 查询用户,应用分页
    if err := dao.db.Offset((page - 1) * pageSize).Limit(pageSize).Find(&users).Error; err != nil {
        log.Printf("Failed to get users: %v", err)
        return nil, 0, err
    }

    return users, total, nil
}

说明

  1. 参数

    • GetAllUsers 现在接受两个参数:pagepageSize,用于控制分页。
  2. 获取总记录数

    • 在查询用户之前,使用 Count 方法获取用户的总数,以便后续的分页响应中使用。
  3. 应用分页

    • 使用 OffsetLimit 方法进行分页查询,计算出要跳过的记录数和每页的大小。

 

3.2 Service 层中调用

func (s *UserService) GetUsers(page, pageSize int) ([]entity.User, int64, error) {
    return s.dao.GetAllUsers(page, pageSize)
}

 3.3Controller 层中调用

func getUsers(c *gin.Context) {
    reqPage := pagination.NewReqPage(c)

    users, total, err := userService.GetUsers(reqPage.Page, reqPage.PageSize)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get users"})
        return
    }

    paginatedResponse := pagination.NewPage(reqPage.Page, reqPage.PageSize, total, users)
    c.JSON(http.StatusOK, paginatedResponse)
}

这样就完成了在三层架构中对分页请求的支持。

四、总结:

  • Find:直接用于查询并返回结果集,通常是一次性操作。
  • Model:用于构建更复杂的查询,可以用于链式调用,比如计算、条件查询等。

通常会先使用 Model 来设置查询的上下文,然后使用 FindCountWhere 等方法来构建和执行查询。这样可以保持代码的清晰和可读性。

上一篇:商业数据库 - oracle -表空间


下一篇:android openGL中模板测试、深度测试功能的先后顺序