字段过滤
使用结构体数据进行创建或更新数据时,尤其是在更新数据的时候,有些字段可能不需要更新,因此对应的字段就不进行赋值,例如以下代码
type Book struct {
Id uint
Name string
Author string
Price float64
PubTime *gtime.Time `orm:"publish_time"`
}
data := Book{
Name: "Linux驱动开发入门与实践",
PubTime: gtime.New("2023-10-11"),
}
_, err = dao.Book.Ctx(ctx).Where("id", 13).Data(data).Update()
直接这样更新,则id
、author
、price
也会被对应类型的零值更新,分别被更新为0、""、0
要解决这样的问题,有以下几种解决方案:
用Fields指定需要更新的字段
dao.Book.Ctx(ctx).Fields("name", "publish_time").Where("id", 13).Data(data).Update()
用FieldsEx排除不需要更新的字段
dao.Book.Ctx(ctx).FieldsEx("id,author,price").Where("id", 13).Data(data).Update()
用OmitEmpty过滤空值
data := Book{
Name: "Linux驱动开发入门 与实践",
Price: 0,
PubTime: nil,
}
dao.Book.Ctx(ctx).Where("id", 13).OmitEmpty().Data(data).Update()
用这种方法如上数据中,0和nil
也会被忽略,没法更新对应字段的值。
使用do对象进行字段过滤
使用gf gen dao
时,每个表会生成一个对应的do
对象,使用do
对象作为参数传递,将会自动过滤空值
data := do.Book{
Name: "Linux驱动开发入门与实践",
Price: 0,
PublishTime: nil,
}
dao.Book.Ctx(ctx).Where("id", 13).Data(data).Update()
使用这种方法,非nil
的零值都可以更新。
do
对象也可以用于传递查询条件, 也会自动过滤空值
where := do.Book{
Author: "郑强",
Id: 13,
PublishTime: nil,
}
books, err := dao.Book.Ctx(ctx).Where(where).All()
// 相当于
books, err := dao.Book.Ctx(ctx).Where("id", 13).Where("author", "郑强").All()