Написав веб-сервер на 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 состоит из структуры 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
}
@ParitoshSingh Предоставьте дополнительную информацию /
@MostafaSolati Вы имели в виду @PrimeGrandLol? :)
@MostafaSolati Обновленная информация. На самом деле, я думаю, что неправильно понимаю рабочий процесс Горма, вместо того, чтобы иметь проблемы с исходным кодом.





С вашим Условия поиска проблем нет. Просто вы указали несколько идентификаторов в своих запросах со второй итерации. Один в 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'))
Почему? Потому что вы использовали ту же переменную день, чтобы прочитать результат строки.
В первый раз все нормально. Но во второй раз ваш деньпеременная уже имеет идентификатор в ней. И вы предоставили еще один в Where. Вот почему его текущий запрос с двумя идентификаторами.
You are actually providing two
id, one inwhereclause and another inFind.
Измените свой код, чтобы каждый раз заново объявлять переменную день. Нравится.
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)
}
Каждый раз будет использоваться новая и чистая переменная. И ваша проблема будет решена.
Спасибо. Надеюсь, что это поможет вам.
Большое спасибо за помощь! Это решило проблему!
Можете ли вы вставить структуру для базы данных школьного сервера и ее функцию отладки? Также что такое структура для dayz /