1. 使用updates更新字段为0或""时
在updates更新时,会默认将数值为0、字符串为""等忽略掉,不会更新;比如
db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false, Games: 0, Friend: ""})
时,Games和Friend更新均会失败。此时需要使用update的方式进行更新:
db.Model(&user).Update("games", 0).Update("friend", "")
这里需要注意的是,上述提交中写了2次Update就会有2次提交,一般我们是不会希望这样的;这种情况下可以使用updates的map结构:
db.Model(&user).Updates(map[string]interface{}{"games": 0,"friend": "","name": "hello","age": 18,"active": false
})
2. 指定字段实现自增
在使用开源项目netplay-lobby-server时,发现启动的服务中的session表对应的roomId总是为0,检查代码逻辑:RoomID设置了AUTO_INCREMENT
检查数据库中session表时发现RoomID字段没有对应的字段AUTO_INCREMENT
排查后发现问题出现在id设置了primary_key之后,需要对roomId做区分;于是重新设置了表结构
type Session struct {ID string `json:"-" gorm:"primary_key;size:64"`ContentHash string `json:"-" gorm:"size:64"`RoomID int32 `json:"room_id" gorm:"autoIncrement;uniqueIndex:idx_room_id"`Username string `json:"username"`Country string `json:"country" gorm:"size:2"`...
}
再次创建表后,RoomID的设置可以了:
小结
在GORM中,AUTO_INCREMENT通常用于整数字段,并且该字段应该是主键或者有唯一索引。当设置的表中已经存在ID字段作为主键时,需要设置其他字段 AUTO_INCREMENT时,可以通过如下设置
gorm:"autoIncrement;uniqueIndex:idx_x"
达到效果。
3. update时在某个字段上累加
1)更新total字段:在total原有基础上累加
# 方式1
db.Model(&user).Update("total", gorm.Expr("total+ ?", 1))
# 方式2
db.Model(&user).Updates(map[string]interface{}{"total": gorm.Expr("total+ ?", 1)
})
2)更新total字段:在其他字段基础上增加
# 方式1
db.Model(&user).Update("total", gorm.Expr("online+ ?", 1))
# 方式2
db.Model(&user).Updates(map[string]interface{}{"total": gorm.Expr("online+ ?", 1)
})