为了账号安全,请及时绑定邮箱和手机立即绑定

Gorm 更新并在单个操作中获取更新的行?

Gorm 更新并在单个操作中获取更新的行?

Go
繁星淼淼 2023-07-17 17:10:58
有没有办法通过单个操作来获取已使用 Gorm 中的更新命令更新的行。
查看完整描述

3 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

我知道这已经有一百万年的历史了,但为了完成,这里采用 Gorm 的方法 -子句

    result := r.Gdb.Model(&User{}).Clauses(clause.Returning{}).Where("id = ?", "000-000-000").Updates(content)
查看完整回答
反对 回复 2023-07-17
?
慕标5832272

TA贡献1966条经验 获得超4个赞

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

}


查看完整回答
反对 回复 2023-07-17
?
白衣非少年

TA贡献1155条经验 获得超0个赞

如果您知道要更新的行数相对较小(<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)

这对于竞争条件是安全的,因为它使用 ID 列表来执行更新而不是重复子句WHERE。正如您可以想象的那样,当您开始谈论数千行时,这变得不太实用。


查看完整回答
反对 回复 2023-07-17
  • 3 回答
  • 0 关注
  • 257 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信