【青训营】Gin+Gorm开发在线备忘录(To do list) | 青训营笔记

447 阅读2分钟

Gin+Gorm开发在线备忘录(To do list)

这是我参与「第三届青训营 -后端场」笔记创作活动的的第6篇笔记。

仓库地址:github.com/qingbo1011/…

Gin:

Gorm:

记录ShouldBind使用遇到的坑(GET or POST?)

这里是我自己马虎了:

因为API里使用的是GET,所以在PostMan中就应该这么写URL:localhost:8080/api/task/getall?page_size=2&page_num=1

gorm分页查询报错 sql: no rows in result set

参考文章:gorm分页查询count报错 sql: no rows in result set

原本gorm的查询是这么写的:DB.Where("uid = ?", uid).Limit(s.PageSize).Offset(s.PageSize * (s.PageNum - 1)).Find(&tasks).Count(&count)

注意Count()查询必须在where条件之后,limit,offset 分页之前

  • 如果写在limit,offset 分页 之前之后,在第二页开始就会报错 sql: no rows in result set
  • count也不能太前,否则查询出来的总数将是所有数据总数,非条件过滤后的条数
 // 错误db.Order("id desc").Limit(10).Offset(10).Find(&List).Count(&totalRows)
 //count应该条件where之后,分页条件之前,如以下,但是结果报错:incorrect table name
 db.Order("id desc").Count(&totalRows).Limit(10).Offset(10).Find(&List)
 ​
 // 正确写法
 db.Table("TableName").Order("id desc").Count(&totalRows).Limit(10).Offset(10).Find(&List)

修改后应该如下:DB.Table("task").Order("created_at desc").Where("uid = ?", uid).Count(&count).Limit(s.PageSize).Offset(s.PageSize * (s.PageNum - 1)).Find(&tasks)

关于分页查询中添加keyword进行模糊查询的gorm写法

代码中我是这样写的:

 err := mysql.DB.Table("task").Where("uid = ? and tittle like ?", uid, "%"+s.KeyWord+"%").Or("uid = ? and context like ?", uid, "%"+s.KeyWord+"%").
     Count(&count).Limit(s.PageSize).Offset(s.PageSize * (s.PageNum - 1)).Find(&tasks).Error

但也可以这样写,连续带上两个Where

 err := mysql.DB.Table("task").Where("uid = ?", uid).Where("tittle like ? or context like ?", "%"+s.KeyWord+"%", "%"+s.KeyWord+"%").
    Count(&count).Limit(s.PageSize).Offset(s.PageSize * (s.PageNum - 1)).Find(&tasks).Error

心得

这是项目编写过程中踩到的一些坑。其中遇到的问题,有些我是在Stack Overflow上通过提问得到解答的。所以以后在学习中一定要注重使用搜索引擎。 另外,以后如果需要使用Gin项目,利用把这个demo作为示例进行开发。