3 回答

TA貢獻1798條經驗 獲得超7個贊
默認情況下,gorm 不會更新默認值(零)或 nil 值。如果您想控制它,請使用我在下面描述的東西。您可以使用 sql 包提供的可空類型或創建自己的類型。
type Model struct {
Amount *sql.NullFloat64
}
// amount will not be updated
gorm.Updates(Model{Amount: nil})
// amount will be updated as a null
gorm.Updates(Model{Amount: &sql.NullFloat64{}})
// amount will be updated as a 10.50
gorm.Updates(Model{Amount: &sql.NullFloat64{Float64: 10.50, Valid: true}})

TA貢獻1856條經驗 獲得超5個贊
time.Time結構內字段類型的零值或默認值是time.Time{}. 使用 時Updates,要么不填充CreatedAt字段,要么為其賦值time.Time{}。
CreatedAt在下面的示例中,在兩種情況下都為字段打印出默認值或零值。
package main
import (
"fmt"
"time"
)
type T struct {
CreatedAt time.Time
C int
S string
}
func main() {
fmt.Println(T{C: 1, S: "one"})
fmt.Println(T{C: 2, S: "two", CreatedAt: time.Time{}})
}
// {0001-01-01 00:00:00 +0000 UTC 1 one}
// {0001-01-01 00:00:00 +0000 UTC 2 two}
編輯:另外,如果字段是類型, 我不確定如何CreatedAt: nil,編譯,而不是.CreatedAttime.Time*time.Time
由于您已將Service結構和CreatedAt字段類型更新為*time.Time,因此以下應該可以工作:
tx.Model(&service).Updates(Service{Name: service.Name}) // add all fields that you want to be updated.
// resulting query
// UPDATE services SET name = 'new service name' WHERE id = 'abc123';
官方 GORM 示例在這里
此外,您可以像這樣省略該created_at字段:
tx.Model(&service).Omit("created_at").Updates(service)

TA貢獻1802條經驗 獲得超6個贊
使用地圖 https://gorm.io/docs/update.html#Updates-multiple-columns
tx.Model(&service).Updates(map[string]interface{}{"ID": "abc123", "Name": "new service name", "CreatedAt": nil})
- 3 回答
- 0 關注
- 973 瀏覽
添加回答
舉報