Skip to main content

字段过滤

使用结构体数据进行创建或更新数据时,尤其是在更新数据的时候,有些字段可能不需要更新,因此对应的字段就不进行赋值,例如以下代码

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

直接这样更新,则idauthorprice也会被对应类型的零值更新,分别被更新为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()