记一次 Gorm 批量插入遇到的问题以及解决方案

2023-05-16

文章目录

  • 问题现象
  • 解决方案

问题现象

最初,我们用的是老版本的 Gorm,但是因为老版本不支持批量插入的功能,所以我们将 Gorm 做了升级,升级到1.21.9版本。

  • https://github.com/go-gorm/gorm/releases/tag/v1.21.9

升级之后,Gorm 确实支持了批量插入的功能。但因为我们后续用到了批量插入返回的记录ID,也就是数据库自增生成的主键 ID 这个值,这时就出现了问题。当然,出现这个问题是有一个前提的,那就是数据库设置的自增步长大于 1,如果自增步长是 1,则没有问题。

因为数据库主从的问题,我们设置的数据库自增步长是 2,所以我们遇到了这个问题。问题的现象是,我们批量插入了三条记录,数据库自增生成的 ID 分别是 1074、1076 和 1078,但 Gorm 返回的结果中,记录的 ID 分别是 1074、1075 和 1076,这意味着 Gorm 返回的 ID 和数据库自增生成的 ID 不一致

为了验证这个问题,大家可以通过下面的两条 SQL 查看数据库的自增属性和设置自增步长。

  • 查看自增属性:show variables like '%increment%';
  • 设置自增步长:set @@auto_increment_increment=1;

需要注意的是,上述设置步长命令仅对单次链接有效,重启 MySQL 后失效。

解决方案

在出现问题之前,我们用于接收数据库记录的结构为:

type Record struct {
	ID         int64     `gorm:"primary_key;column:id;type:bigint(20) unsigned;not null" json:"id"`       
	...
	...                   
	CreateTime time.Time `gorm:"column:create_time;type:timestamp;not null" json:"create_time"`
}

在出现问题之后,为了解决这个问题,我们用于接收数据库记录的结构修改为:

type Record struct {
	ID         int64     `gorm:"primary_key;column:id;type:bigint(20) unsigned;not null;autoIncrementIncrement:2" json:"id"`       
	...
	...                   
	CreateTime time.Time `gorm:"column:create_time;type:timestamp;not null" json:"create_time"`
}

两者的差异就在于后者 ID 的gorm配置之中,新增了autoIncrementIncrement:2标签。其中,

  • autoIncrementIncrement:表示自动步长,控制连续记录之间的间隔;
  • 2:表示我们数据库设置的自增步长。

实际上,应该是autoIncrementIncrement:N,其中N对应我们数据库设置的自增步长,因为我们数据库的自增步长设置是 2,所以这里就配置成了 2,具体可以根据实际情况进行调整。

最后,给大家推荐「Gorm 文档」,没事多看看,可以避免采坑啊!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记一次 Gorm 批量插入遇到的问题以及解决方案 的相关文章

  • 重试机制 Retry

    文章目录 1 重试1 1 重试作用 2 重试的三种方法2 1 java retry2 2 spring retry2 3 guava retrying2 3 1 重试源2 3 2 自定义重试监听器 RetryListener2 3 3 停止
  • win10系统开机输入密码黑屏解决方法

    第一步 xff1a 首先打开笔记本电脑开机 xff0c 输入开机密码进入第二步 xff1a 输入密码后显示黑屏 xff0c 按 Ctrl 43 Alt 43 Del 34 组合键打开任务管理器第三步 xff1a 在打开的任务管理器中 xff
  • Windows下LaTex转为Word

    文章目录 1 latex gt pdf gt word1 1 以word打开1 2 使用adobe acrobat DC打开 2 latex typora gt word xff08 pandoc xff09 2 0 参数介绍2 1 安装p
  • SQL:用count求group by分组的个数

    1 求每一分组内的个数 查询选修了全部课程的学生姓名 思路 查询一个学生的姓名 xff0c 该学生选修课的门数等于所有课程的门数 逆推 xff1a 查询一个学生的姓名 xff0c 姓名怎么来 xff1f 通过Student的学号得到 xff
  • SQL:数据去重的三种方法

    1 使用distinct去重 distinct用来查询不重复记录的条数 xff0c 用count distinct id 来返回不重复字段的条数 用法注意 xff1a distinct 查询字段 xff0c 必须放在要查询字段的开头 xff
  • Word页面中四个直角

    文章目录 1 四个直角1 xff09 代表页边距2 xff09 页边距的设置3 xff09 打开或关闭 裁剪标记 2 裁剪标记 与图片1 xff09 插入图片超过这个角能打印显示出来吗 xff1f 3 裁剪标记 与表格 1 四个直角 1 x
  • windows搭建ftp及原理(小白向)

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 环境一 实验步骤1 1安装ftp 二 ftp实验引发的思考1 简单阐述ftp的原理2 ftp建立的流程 总结 环境 windwo
  • Win10系统自动更新失败(错误代码0x800f0922)

    笔者最近遇到了Win10系统自动更新失败的问题 xff0c 错误代码0x800f0922 每次更新下载安装完 xff0c 重启电脑的时候就会提示 xff1a 我们无法完成更新 正在撤销更改 在设置 Windows更新中有 xff1a 202

随机推荐

  • Linux yum安装redis

    1 安装redis数据库 yum install redis 2 下载fedora的epel仓库 yum install epel release 3 启动redis服务 systemctl start redis 4 查看redis状态
  • Centos 开启X11 Forwarding,实现无桌面环境运行GUI软件

    文章目录 修改SSH配置文件sshd config安装 X11 Forwarding 相关软件重启 sshd 服务 xff0c 并重新SSH连接验证 我们新安装Centos时可能会选择最小安装 xff0c 不安装桌面环境 xff0c 但是后
  • Python pyttsx3|文本朗读(各种语言)

    Python文字转语音 程序员 xff0c 在其他人眼中往往都是高冷的存在 xff0c 在他们的眼中能用代码解决的问题绝对不考虑其他的方法 xff0c 本文让我们用Python来提升一下高冷的档次 xff0c 让我们用代码来 说话 安装py
  • Spring Security 出现 'login.html?error' is not a valid redirect URL 异常

    原因是这个URL地址要以 打头 例如 xff1a 报错的代码 xff1a http span class token punctuation span span class token function formLogin span spa
  • 5. Python3的基本类型(元组)

    Python3的基本类型 xff08 元组 xff09 1 Python 的元组与列表相似 xff0c 不同之处 xff1a 元组不能修改 xff0c 元组使用小括号 xff0c 列表使用方括号 2 元组的创建 xff1a 只需要在括号中添
  • group by内部排序

    规则 xff1a 第一 xff0c 凡是在group by后面出现的字段 xff0c 必须同时在select后面出现 xff1b 第二 xff0c 凡是在select后面出现的 同时未在聚合函数中出现的字段 xff0c 必须同时出现在gro
  • 李宏毅机器学习(四)Spatial Transformer Layer

    学习内容 架构 xff1b 目的就是克服CNN的旋转和缩放不变性的缺点的 xff01 前情提要 CNN is not invariant to scaling and rotation xff1b CNN对缩放和旋转不是不变的 xff1b
  • python修改pip安装镜像源

    pip 默认的安装源安装真的很慢 xff0c 所以我们可以换成国内的一些优质的安装源 通用临时方法 pip install package name i https pypi tuna tsinghua edu cn simple 永久修改
  • 深入理解 Java 线程池的实现原理

    文章目录 1 线程状态2 线程池2 1 线程池的作用2 2 线程池的实现2 2 1 线程池内部状态 1 线程状态 既然要说线程 xff0c 我们就先来了解一下线程的几种状态 xff1a span class token keyword pu
  • windows server安装域控及原理(小白向)

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 安装环境一 安装域控二 说明一下遗留的问题总结 这个是一系列的博客文章 xff0c 域控只是开始 安装环境 windwos任意s
  • 详述 Redis 选择单线程模型的原因以及 I/O 多路复用

    文章目录 Redis 选择单线程模型的原因概述设计单线程模型可维护性并发处理性能瓶颈 引入多线程删除操作 总结 Redis 和 IO 多路复用几种 I O 模型Blocking I OI O 多路复用 Reactor 设计模式I O 多路复
  • 新一代垃圾回收器 ZGC 的探索与实践

    文章目录 GC之痛CMS 与 G1 停顿时间瓶颈标记阶段停顿分析清理阶段停顿分析复制阶段停顿分析 ZGC原理全并发的 ZGCZGC 关键技术ZGC 并发处理演示 ZGC 调优实践调优基础知识理解 ZGC 重要配置参数理解 ZGC 触发时机理
  • 详述 Spring 中 Bean 的作用域、事务的隔离级别以及传播行为

    文章目录 Bean 作用域XML 声明singletonprototyperequestsessionglobalSession 注解声明 事务隔离级别事务传播行为 Bean 作用域 Spring IOC 容器创建一个 Bean 实例时 x
  • 饿了么交易系统 5 年演化史

    作者介绍 xff1a 杨凡 xff0c 花名挽晴 xff0c 饿了么高级架构师 xff0c 2014 年加入饿了么 xff0c 2018 年随饿了么被阿里巴巴收购一同加入阿里巴巴 xff0c 4 年团队管理经验 xff0c 4 年主要从事饿
  • 带你了解「美团、百度和滴滴」的分布式 ID 生成系统

    文章目录 美团背景常见方法介绍UUID类snowflake方案数据库生成 Leaf 方案实现Leaf segment 数据库方案双 buffer 优化Leaf 高可用容灾 Leaf snowflake 方案弱依赖 ZooKeeper解决时钟
  • Spring Cloud 优雅下线以及灰度发布

    文章目录 前言优雅下线常见的下线方式优雅的下线方式 灰度发布蓝绿部署滚动部署金丝雀部署 前言 在生产环境中 xff0c 如何保证在服务升级的时候 xff0c 不影响用户的体验 xff0c 这个是一个非常重要的问题 如果在我们升级服务的时候
  • 详述 IntelliJ IDEA 遇到 Maven 项目 pom.xml 文件没有识别的解决方法

    文章目录 问题现象解决方法 问题现象 有的时候 xff0c 我们可能会遇到 IDEA 没有识别 Maven 项目pom xml的问题 xff0c 其表现出来的现象就是 xff1a 究其原因 xff0c 就是 IDEA 把pom xml文件当
  • Spring Boot 自定义 Swagger2 请求 URL 路径的两种方法

    文章目录 前言方法一 xff1a 修改应用根路径方法二 xff1a 引入 Swagger2 前端代码总结 前言 首先 xff0c 把 Swagger2 的依赖引进来 xff1a span class token comment lt swa
  • 使用 Apollo 为静态变量赋值的方法

    Apollo xff08 阿波罗 xff09 是携程框架部门研发的分布式配置中心 xff0c 能够集中化管理应用不同环境 不同集群的配置 xff0c 配置修改后能够实时推送到应用端 xff0c 并且具备规范的权限 流程治理等特性 xff0c
  • 记一次 Gorm 批量插入遇到的问题以及解决方案

    文章目录 问题现象解决方案 问题现象 最初 xff0c 我们用的是老版本的 Gorm xff0c 但是因为老版本不支持批量插入的功能 xff0c 所以我们将 Gorm 做了升级 xff0c 升级到1 21 9版本 https github