gpt4 book ai didi

postgresql - 在数据库上的每个api调用上,gorm范围都会继续添加到上一个

转载 作者:行者123 更新时间:2023-12-01 21:09:45 25 4
gpt4 key购买 nike

以下是我的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
}

if strings.TrimSpace(limitParam) != "" {
limit, err = strconv.Atoi(limitParam)
if err != nil {
return merry.Wrap(err)
}
} else {
limit = 10
}
accessOwners := []models.AccessOwner{}
page.Resources = []models.AccessOwner{}
page.Skip = skip
page.Limit = limit


db = db.Scopes(GetCount(*ao)).Model(page.Resources).Count(&page.Total)
db = db.Offset(skip)
db = db.Limit(limit)
if err := db.Find(&accessOwners).Error; err != nil {
return merry.Wrap(err)
}

page.Resources = accessOwners
return c.JSON(201, page)

}
}

func GetCount(ao models.AccessOwner) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
return db.Where(ao)
}

最佳答案

doc

When using multiple immediate methods with GORM, later immediatemethod will reuse before immediate methods’s query conditions


您正在设置 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)

关于postgresql - 在数据库上的每个api调用上,gorm范围都会继续添加到上一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62727570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com