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

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部