【发布时间】:2020-01-06 18:45:39
【问题描述】:
有没有什么方法可以使用 Gorm 中的更新命令,使用单个操作来获取已更新的行。
【问题讨论】:
-
这取决于...您使用的是什么数据库?
-
我正在使用 Postgres @dave
有没有什么方法可以使用 Gorm 中的更新命令,使用单个操作来获取已更新的行。
【问题讨论】:
这不是很漂亮,但是由于您使用的是 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)
}
【讨论】:
如果您知道要更新的行数相对较少 (
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)
这对竞争条件是安全的,因为它使用 ID 列表进行更新,而不是重复 WHERE 子句。正如您可以想象的那样,当您开始谈论数千行时,这变得不那么实用了。
【讨论】: