Gin+Gorm开发在线备忘录(To do list)
这是我参与「第三届青训营 -后端场」笔记创作活动的的第6篇笔记。
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作为示例进行开发。