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 关注
- 797 浏览
添加回答
举报