空值处理

空值主要影响于写入/更新操作,如Insert, Replace, Update, Save操作。

map/struct 中存在空值如 nil,"",0 时,默认情况下,gdb将会将其当做正常的输入参数,因此这些参数也会被更新到数据表。如以下操作(以map为例,struct同理):

  1. // UPDATE `user` SET `name`='john',update_time=null WHERE `id`=1
  2. g.DB("user").Data(g.Map{
  3. "name" : "john",
  4. "update_time" : nil,
  5. }).Where("id", 1).Update()

Option方法

我们可以通过Option方法来过滤掉这些空值,并给定gdb.OPTION_OMITEMPTY,例如,以上示例可以修改为:

  1. // UPDATE `user` SET `name`='john' WHERE `id`=1
  2. g.DB("user").Option(gdb.OPTION_OMITEMPTY).Data(g.Map{
  3. "name" : "john",
  4. "update_time" : nil,
  5. }).Where("id", 1).Update()

对于struct的空值过滤操作示例:

  1. type User struct {
  2. Id int `orm:"id"`
  3. Passport string `orm:"passport"`
  4. Password string `orm:"password"`
  5. NickName string `orm:"nickname"`
  6. CreateTime string `orm:"create_time"`
  7. UpdateTime string `orm:"update_time"`
  8. }
  9. user := User{
  10. Id : 1,
  11. NickName : "john",
  12. UpdateTime: gtime.Now().String(),
  13. }
  14. g.DB("user").Option(gdb.OPTION_OMITEMPTY).Data(user).Save()
  15. // INSERT INTO `user`(`id`,`nickname`,`update_time`) VALUES(1,'john','2019-10-01 12:00:00') ON DUPLICATE KEY UPDATE `id`=VALUES(`id`) `nickname`=VALUES(`nickname`) `update_time`=VALUES(`update_time`)

注意,批量写入/更新操作中Option方法将会失效,因为在批量操作中,必须保证每个写入记录的字段是统一的。

更新特定字段

此外,我们也可以更新特定的字段,通过Fields方法指定。例如:

  1. // INSERT INTO `user`(`id`,`passport`) VALUES(1,'john')
  2. db.Table("user").Fields("id, passport").Data(g.Map{
  3. "id": 1,
  4. "passport": "john",
  5. "password": "123456",
  6. "nickname": "John",
  7. }).Insert()

对于struct的空值过滤及特定字段更新操作示例:

  1. type User struct {
  2. Id int `orm:"id"`
  3. Passport string `orm:"passport"`
  4. Password string `orm:"password"`
  5. NickName string `orm:"nickname"`
  6. CreateTime string `orm:"create_time"`
  7. UpdateTime string `orm:"update_time"`
  8. }
  9. user := User{
  10. Id : 1,
  11. NickName : "john",
  12. UpdateTime: gtime.Now().String(),
  13. }
  14. g.DB("user").Option(gdb.OPTION_OMITEMPTY).Fields("id,nickname").Data(user).Save()
  15. // INSERT INTO `user`(`id`,`nickname`) VALUES(1,'john') ON DUPLICATE KEY UPDATE `id`=VALUES(`id`) `nickname`=VALUES(`nickname`)