调用 Updates() 时 GORM 更新空字段?

根据GORM 的文档:


Updates 支持使用 struct 或 map[string]interface{} 进行更新,使用 struct 更新时默认只会更新非零字段


我的数据库中已经有一个Service带有 ID 的条目,abc123. 我正在尝试获取如下所示的对象:


Service{

  ID: "abc123",

  Name: "new service name",

  CreatedAt: nil,

}

并用它来更新我现有的记录。但是当我打电话时:


tx.Model(&service).Updates(service)

数据库中的CreatedAt值被覆盖nil。如何在不覆盖值的情况下更新我的数据库记录CreatedAt?


更新:下面是我的Service结构


type Service struct {

  ID        string  `gorm:"not null;type:char(32);primary_key;column:id"`

  Name      string  `json:"name" gorm:"size:50;not null;"`

  CreatedAt *time.Time

  UpdatedAt time.Time

  DeletedAt *time.Time `gorm:"index"`

}

我为我的Service结构尝试了两种不同的变体。另一个是CreatedAt类型time.Time而不是*time.Time. *time.Time它将用空值覆盖我的数据库中的值。time.Time它尝试用未初始化的时间值覆盖数据库中的值并引发错误:Error 1292: Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1


三国纷争
浏览 798回答 3
3回答

元芳怎么了

默认情况下,gorm 不会更新默认值(零)或 nil 值。如果您想控制它,请使用我在下面描述的东西。您可以使用 sql 包提供的可空类型或创建自己的类型。type Model struct {    Amount *sql.NullFloat64}// amount will not be updatedgorm.Updates(Model{Amount: nil})// amount will be updated as a nullgorm.Updates(Model{Amount: &sql.NullFloat64{}})// amount will be updated as a 10.50gorm.Updates(Model{Amount: &sql.NullFloat64{Float64: 10.50, Valid: true}})

RISEBY

time.Time结构内字段类型的零值或默认值是time.Time{}. 使用 时Updates,要么不填充CreatedAt字段,要么为其赋值time.Time{}。CreatedAt在下面的示例中,在两种情况下都为字段打印出默认值或零值。package mainimport (    "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)

呼啦一阵风

使用地图 https://gorm.io/docs/update.html#Updates-multiple-columnstx.Model(&service).Updates(map[string]interface{}{"ID": "abc123", "Name": "new service name", "CreatedAt": nil})
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go