Gorm Обновить и получить обновленные строки за одну операцию?

Есть ли способ получить обновленные строки с помощью команды обновления в Gorm за одну операцию.


person Aayush Taneja    schedule 03.09.2019    source источник
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
comment
Дай мне попробовать. - 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
comment
Но это ведь 2 операции? Можно ли получить идентификаторы обновленных строк в той же операции? - person Aayush Taneja; 04.09.2019