Golang GORM搜索条件

时间:2018-12-11 09:37:00

标签: postgresql go go-gorm

我用gorm和postgres在Golang中编写了一个Web服务器,我被误解了,下面的代码在第二次循环迭代中到底发生了什么:

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

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

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”由结构日组成:

type Day struct {
    gorm.Model
    StudentID uint // parent id
    Date string `sql:"size:255"`
    Tasks []Task // has-many relation
    Lessons []Lesson // has-many relation
}

1 个答案:

答案 0 :(得分:0)

您的搜索条件没有问题。只是您从第二次迭代开始就在查询中提供了多个ID。 Where中一个,Find中另一个。

让我写一个像你一样的例子

ids := []int{1, 2}
var org database.Organization
for _, i := range ids {
    db, _ := connection.NewPGConnection(info)
    db = db.Debug().New()
    db.Where("id = ?", i).Find(&org)
}

此处,第一次迭代中的SQL查询如下:

SELECT * FROM "organizations"  WHERE "organizations"."deleted_at" IS NULL AND ((id = '1'))

第二次迭代将是:

SELECT * FROM "organizations"  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中。

更改代码,每次 day 都重新声明变量。这样。

ids := []int{1, 2}
for _, i := range ids {
    db, _ := connection.NewPGConnection(info)
    db = db.Debug().New()
    var org database.Organization  // <----- move your variable day here
    db.Where("id = ?", i).Find(&org)
}

每次将使用新的干净变量。您的问题将得到解决。

谢谢。希望对您有帮助。