当前位置: 首页 > article >正文

gorm使用注意事项

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

http://www.kler.cn/a/394226.html

相关文章:

  • SpringBoot(十八)SpringBoot集成Minio
  • goframe开发一个企业网站 验证码17
  • 985研一学习日记 - 2024.11.14
  • 2023年MathorCup数学建模B题城市轨道交通列车时刻表优化问题解题全过程文档加程序
  • C++单例模式与多例模式
  • 开发语言中,堆区和栈区的区别
  • 轮转数组
  • 旅行照片 4.0 问题三、四
  • 【自用】0-1背包问题与完全背包问题的Java实现
  • 视频横屏转竖屏播放-使用人脸识别+目标跟踪实现
  • [自然语言处理] [AI]深入理解语言与情感分类:从基础到深度学习的进展
  • Unity自动LOD工具AutoLOD Mesh Decimator的使用
  • HarmonyOS开发 API 13发布首个Beta版本,部分已知的问题建议处理方案
  • 删除.svn版本控制文件夹后,文件夹上的svn图标仍然显示的问题
  • 使用etl工具kettle的日常踩坑梳理之二、从Hadoop中导出数据
  • 分糖果(条件分配)
  • Works With线上开发者大会将提供物联网行业深入的专业知识和技能
  • uniapp form表单校验
  • python爬虫获得店铺的所有商品
  • 【JavaEE初阶 — 多线程】生产消费模型 阻塞队列
  • 基于Java的企业资产管理系统
  • Springboot 日志处理(非常详细)
  • 从opencv-python入门opencv--图像处理之图像滤波
  • golang HTTP基础
  • 【计网】实现reactor反应堆模型 --- 多线程方案优化 ,OTOL方案
  • C++算法练习-day39——654.最大二叉树