3 回答

TA貢獻1828條經驗 獲得超13個贊
我知道這已經有一百萬年的歷史了,但為了完成,這里采用 Gorm 的方法 -子句。
????result?:=?r.Gdb.Model(&User{}).Clauses(clause.Returning{}).Where("id?=??",?"000-000-000").Updates(content)

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)
}

TA貢獻1155條經驗 獲得超0個贊
如果您知道要更新的行數相對較?。?lt;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。正如您可以想象的那樣,當您開始談論數千行時,這變得不太實用。
- 3 回答
- 0 關注
- 312 瀏覽
添加回答
舉報