它并不漂亮,但由于您使用的是 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 sureif 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)}
如果您知道要更新的行数相对较小(<1000),那么这是一个不错的解决方案var ids []intvar results []YourModel// Get the list of rows that will be affecteddb.Where("YOUR CONDITION HERE").Table("your_table").Select("id").Find(&ids)query := db.Where("id IN (?)", ids)// Do the updatequery.Model(&YourModel{}).Updates(YourModel{field: "value"})// Get the updated rowsquery.Find(&results)这对于竞争条件是安全的,因为它使用 ID 列表来执行更新而不是重复子句WHERE。正如您可以想象的那样,当您开始谈论数千行时,这变得不太实用。