【问题标题】:Gorm Update and Get the Updated Rows in a single operation?Gorm 在一次操作中更新和获取更新的行?
【发布时间】:2020-01-06 18:45:39
【问题描述】:

有没有什么方法可以使用 Gorm 中的更新命令,使用单个操作来获取已更新的行。

【问题讨论】:

  • 这取决于...您使用的是什么数据库?
  • 我正在使用 Postgres @dave

标签: go go-gorm


【解决方案1】:

这不是很漂亮,但是由于您使用的是 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)
}

【讨论】:

  • 让我试试这个。
【解决方案2】:

如果您知道要更新的行数相对较少 (

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 子句。正如您可以想象的那样,当您开始谈论数千行时,这变得不那么实用了。

【讨论】:

  • 但这是 2 次操作对吧?是否可以在同一操作中获取更新行的 id?
猜你喜欢
  • 2020-10-07
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多