在 db 上的每个 api 调用中,gorm 范围不断添加到前一个

下面是我的 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 2

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

2020-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

        }

}



月关宝盒
浏览 132回答 1
1回答

MM们

来自文档在 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)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.Offset(skip).Limit(limit).Find(&accessOwners)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go