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

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

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

Go
三国纷争 2022-06-27 16:41:42
根据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
查看完整描述

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


查看完整回答
1 反对 回复 2022-06-27
?
RISEBY

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)


查看完整回答
反对 回复 2022-06-27
?
呼啦一阵风

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



查看完整回答
反对 回复 2022-06-27
  • 3 回答
  • 0 关注
  • 797 浏览
慕课专栏
更多

添加回答

举报

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