猿问

Golang GORM 搜索条件

使用 gorm 和 postgres 在 Golang 中编写网络服务器时,我一直误解了以下代码中第二次循环迭代中到底发生了什么:


...

for _, t := range tasks {

    newDbConn := db.SchoolServerDB.Debug().New()

    err = newDbConn.Where("id = ?", t.DayID).First(&day).Error

    if err != nil {

        return errors.Wrapf(err, "Error query day with id='%v'", t.DayID)

    }

    ...

}

...

第一次迭代调试:


SELECT * FROM "days"  WHERE "days"."deleted_at" IS NULL AND ((id = '8')) ORDER BY "days"."id" ASC LIMIT 1

第二次迭代调试:


SELECT * FROM "days"  WHERE "days"."deleted_at" IS NULL AND "days"."id" = '8' AND ((id = '38')) ORDER BY "days"."id" ASC LIMIT 1

关键问题是:尽管每次迭代都会创建一个新连接,但为什么搜索条件会累积?根据文档,每次都必须清除搜索条件。我想得到这样的第二个结果:


SELECT * FROM "days"  WHERE "days"."deleted_at" IS NULL AND ((id = '38')) ORDER BY "days"."id" ASC LIMIT 1

任何帮助表示赞赏!


UPD:

db.SchoolServerDb 只是 *gorm.DB 而 Debug() 是它的方法


表 'days' 由结构 Day 组成:


type Day struct {

    gorm.Model

    StudentID uint // parent id

    Date string `sql:"size:255"`

    Tasks []Task // has-many relation

    Lessons []Lesson // has-many relation

}


繁花不似锦
浏览 181回答 1
1回答

慕姐4208626

您的Search Condition没有问题。您只需在第二次迭代的查询中提供多个 ID。一个在Where另一个在Find。让我写一个像你这样的例子ids := []int{1, 2}var org database.Organizationfor _, i := range ids {&nbsp; &nbsp; db, _ := connection.NewPGConnection(info)&nbsp; &nbsp; db = db.Debug().New()&nbsp; &nbsp; db.Where("id = ?", i).Find(&org)}这里,第一次迭代的 SQL 查询如下:SELECT * FROM "organizations"&nbsp; WHERE "organizations"."deleted_at" IS NULL AND ((id = '1'))在第二次迭代中它将是:SELECT * FROM "organizations"&nbsp; WHERE "organizations"."deleted_at" IS NULL AND "organizations"."id" = '1' AND "organizations"."code" = 'mir' AND ((id = '2'))为什么?因为,您使用了相同的变量day来读取行结果。第一次,没关系。但是第二次,您的day 变量中已经有一个 ID。并且您在Where. 这就是为什么,它的运行查询有两个 id。您实际上提供了两个id,一个在where子句中,另一个在中Find。更改您的代码以每次都重新声明您的变量日。像这样。ids := []int{1, 2}for _, i := range ids {&nbsp; &nbsp; db, _ := connection.NewPGConnection(info)&nbsp; &nbsp; db = db.Debug().New()&nbsp; &nbsp; var org database.Organization&nbsp; // <----- move your variable day here&nbsp; &nbsp; db.Where("id = ?", i).Find(&org)}每次都会使用新的和干净的变量。你的问题将得到解决。谢谢。希望对你有帮助。
随时随地看视频慕课网APP

相关分类

Go
我要回答