Есть ли способ получить обновленные строки с помощью команды обновления в Gorm за одну операцию.
Gorm Обновить и получить обновленные строки за одну операцию?
comment
это зависит ... какую базу данных вы используете?
- person dave   schedule 04.09.2019
comment
Я использую Postgres @dave
- person Aayush Taneja   schedule 04.09.2019
Ответы (2)
Это некрасиво, но поскольку вы используете postgres, вы можете:
realDB := db.DB()
rows, err := realDB.Query("UPDATE some_table SET name = 'a' WHERE name = 'b' RETUNING id, name")
//you could probably do db.Raw but I'm not sure
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
err := rows.Scan(&id, &name)
if err != nil {
log.Fatal(err)
}
log.Println(id, name)
}
person
dave
schedule
04.09.2019
Дай мне попробовать.
- person Aayush Taneja; 04.09.2019
Это достойное решение, если вы знаете, что количество строк, которые вы обновляете, относительно невелико (‹1000).
var ids []int
var results []YourModel
// Get the list of rows that will be affected
db.Where("YOUR CONDITION HERE").Table("your_table").Select("id").Find(&ids)
query := db.Where("id IN (?)", ids)
// Do the update
query.Model(&YourModel{}).Updates(YourModel{field: "value"})
// Get the updated rows
query.Find(&results)
Это безопасно против условий гонки, так как он использует список идентификаторов для обновления вместо повторения предложения WHERE
. Как вы понимаете, это становится немного менее практичным, когда вы начинаете говорить о тысячах строк.
person
Jesse
schedule
03.09.2019
Но это ведь 2 операции? Можно ли получить идентификаторы обновленных строк в той же операции?
- person Aayush Taneja; 04.09.2019