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

仓库地址:https://github.com/qingbo1011/gin-memos

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也不能太前,否则查询出来的总数将是所有数据总数,非条件过滤后的条数
1
2
3
4
5
6
// 错误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写法

代码中我是这样写的:

1
2
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

1
2
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