下面是我的 api 处理程序。在第一次运行时,它给了我正确的输出,并且 db 中的相应调用也是正确的。2020-07-04 14:51:04.512 IST [32129] postgres@postgres LOG: execute <unnamed>: SELECT count(*) FROM "access_owners" WHERE ("access_owners"."area" = $1)2020-07-04 14:51:04.512 IST [32129] postgres@postgres DETAIL: parameters: $1 = '4th Floor'2020-07-04 14:51:04.513 IST [32129] postgres@postgres LOG: execute <unnamed>: SELECT * FROM "access_owners" WHERE ("access_owners"."area" = $1) LIMIT 10 OFFSET 22020-07-04 14:51:04.513 IST [32129] postgres@postgres DETAIL: parameters: $1 = '4th Floor'这是我得到的 API 响应{ "skip": 2, "limit": 10, "total": 3, "resources": [ { "id": 26, "name": "Test_User_5", "email": "test_user_5@gmailcom", "area": "4th Floor" } ]}但是,如果我再次使用相同的参数调用相同的 API,则会在 DB 中再添加一个 where 条件时出错。2020-07-04 14:51:22.560 IST [32129] postgres@postgres LOG: execute <unnamed>: SELECT count(*) FROM "access_owners" WHERE ("access_owners"."area" = $1) AND ("access_owners"."area" = $2) LIMIT 10 OFFSET 22020-07-04 14:51:22.560 IST [32129] postgres@postgres DETAIL: parameters: $1 = '4th Floor', $2 = '4th Floor'这是我得到的错误sql: no rows in result set这是我的 API 处理程序func GetAccessOwners(db *gorm.DB) echo.HandlerFunc { return func(c echo.Context) error { page := new(models.ResourcePage) var ao = new(models.AccessOwner) var err error if err = c.Bind(ao); err != nil { return err } var skip int var limit int skipParam := c.QueryParam("skip") limitParam := c.QueryParam("limit") if strings.TrimSpace(skipParam) != "" { skip, err = strconv.Atoi(skipParam) if err != nil { return merry.Wrap(err) } } else { skip = 0 }}
1 回答
MM们
TA贡献1886条经验 获得超2个赞
来自文档
在 GORM 中使用多个立即方法时,后面的立即方法将在立即方法的查询条件之前重用
您正在设置db这就是为什么在第二个请求中第一个请求的查询条件已经存在于db.
db = db.Scopes(GetCount(*ao)).Model(page.Resources).Count(&page.Total)
db = db.Offset(skip)
db = db.Limit(limit)
所以,不要设置,db而是可以链接多个操作或单独使用
db.Scopes(GetCount(*ao)).Model(page.Resources).Count(&page.Total)
.Offset(skip).Limit(limit).Find(&accessOwners)
- 1 回答
- 0 关注
- 101 浏览
添加回答
举报
0/150
提交
取消