Голанг ГОРМ условия поиска - PullRequest
0 голосов
/ 11 декабря 2018

При написании веб-сервера на Golang с помощью gorm & postgres я застрял в недоразумении, что именно происходит во второй итерации цикла, в следующем коде:

...
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' состоит из struct 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
}

1 Ответ

0 голосов
/ 12 декабря 2018

Нет проблем с вашим условием поиска .Просто вы указали несколько идентификаторов в своих запросах со второй итерации.Один в 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 уже имеет идентификатор .И вы должны предоставить еще один в Where.Вот почему запущен запрос с двумя идентификаторами.

Вы фактически предоставляете два 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)
}

Каждый раз будет использоваться новая и чистая переменная.И ваша проблема будет решена.

Спасибо.Надеюсь, это поможет вам.

...