Gorm 应用开发时区问题与unique唯一索引字段数据冲突问题

news2024/11/28 3:46:57

文章目录

    • 一、定义表模型时区问题
      • 1.1 time.Time 与`int64`
      • 1.2 优势
    • 二、unique唯一索引字段数据冲突问题

一、定义表模型时区问题

1.1 time.Time 与int64

一般情况下,我们在定义表模型的时候,会使用time.Time,但是会根据当前时间存储。返回给前端的时候做时区转换会比较复杂,所以一般用int64:

// User 直接对应数据库中的表
// 有些人叫做entity,有些人叫做model
type User struct {
	Id int64 `gorm:"primaryKey,autoIncrement"`
	// 全部用户唯一
	Email    string `gorm:"unique"`
	Password string

	// 创建时间,毫秒数,使用int64解决时区问题
	Ctime int64
	// 更新时间
	Utime int64
}

1.2 优势

在定义数据库表模型时,选择使用 int64 类型来表示时间戳有一些考虑和优势,尤其是在处理时区问题时。以下是一些优势和考虑因素:

  1. 时区一致性: 使用 int64 表示时间戳可以避免在前端和后端之间进行时区转换的复杂性。int64 类型的时间戳是相对于某个固定的基准时间(通常是UNIX纪元)的毫秒数,不涉及时区信息。这样,你就可以更轻松地在前端和后端之间传递和处理时间信息,而不必担心时区转换引起的问题。
  2. 序列化和传输: 使用 int64 类型的时间戳可以更方便地在网络上传输和序列化,因为它是一个数字。对于前后端通信而言,时间戳是一种常见的时间表示方式。
  3. 易于处理: 在一些情况下,直接使用 int64 类型的时间戳可能更容易处理。例如,你可以轻松进行比较、排序和其他与时间相关的计算,而不涉及时区信息。这在某些业务场景下可能是一种简化处理的方式。
  4. 避免时区混淆: 时区问题可能引起一系列复杂的 bug,而使用 int64 类型可以避免这些问题,只有返回给用户的时候才需要处理时区问题,数据库存储永远是UTC不会出错。并且前端可以直接使用这个时间戳做转换。

二、unique唯一索引字段数据冲突问题

举个例子,当两个用户同时访问,注册同一个邮箱,当线程1插入会成功,线程2插入不会成功,并且会返回系统错误,这会对用户造成很不好的影响。

所以一般使用唯一索引冲突错误码1062来判断。

// ErrUserDuplicateEmail 表示用户邮箱重复的错误
var ErrUserDuplicateEmail = errors.New("邮箱冲突")

// Insert 将用户数据插入数据库
func (dao *UserDAO) Insert(ctx context.Context, u User) error {
	// 存储当前时间的毫秒数
	now := time.Now().UnixNano()
	u.Ctime = now
	u.Utime = now

	// 使用Gorm的Create方法将用户数据插入数据库
	err := dao.db.WithContext(ctx).Create(&u).Error

	// 类型断言,判断是否是MySQL的唯一冲突错误
	if mysqlErr, ok := err.(*mysql.MySQLError); ok {
		const uniqueConflictsErrNo uint16 = 1062
		// MySQL错误码1062表示唯一冲突
		if mysqlErr.Number == uniqueConflictsErrNo {
			// 返回自定义的唯一冲突错误
			return ErrUserDuplicateEmail
		}
	}

	// 返回其他数据库操作可能出现的错误
	return err
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1392806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Javascript,到底要不要写分号?

小白随机在互联网上乱丢一些赛博垃圾,还望拨冗批评斧正。 要不要加分号? 先说结论:“不引起程序出错的前提下,加不加都可以,按自身习惯来。” 为什么JS可以不加分号? 实际上,行尾使用分号的风…

深度学习记录--归—化输入特征

归化 归化输入(normalizing inputs),对特征值进行一定的处理,可以加速神经网络训练速度 步骤 零均值化 通过x值更新让均值稳定在零附近,即为零均值化 归化方差 适当减小变量方差 解释 归化可以让原本狭长的数据图像变得规整,梯度下降的…

JavaScript基础(27)_内联样式的获取和修改、获取元素当前显示的样式

内联样式的获取和修改 获取元素的内联样式: 语法:元素.style.样式名 注意:通过style属性设置和读取的都是内联样式,无法读取样式表中的样式。 修改元素的内联样式: 语法:元素.style.样式名 样式值比如…

Apache JMeter 3.1压力测试监控服务器数据(cpu、内存、磁盘io等)

Apache JMeter 3.1压力测试 Apache JMeter 3.1压力测试监控cpu、内存情况1.下载Apache JMeter 3.11.1 添加线程组1.2 添加http请求1.3 增加http请求头设置1.4 添加csv配置1.5 添加测试结果监控配置 2. 监控插件下载3. 服务端插件下载并启动3.1 下载3.2 解压并启动3.3 增加服务器…

136基于matlab的自适应滤波算法的通信系统中微弱信号检测程序

基于matlab的自适应滤波算法的通信系统中微弱信号检测程序,周期信号加入随机噪声,进行滤波,输出滤波信号,程序已调通,可直接运行。 136 matlab自适应滤波算法LMS (xiaohongshu.com)

提高支撑座效率的重要性

自动化机械设备在运行过程中需要消耗大量的能源和资源,提高效率意味着更有效地利用这些资源,降低运行成本,而支撑座作为自动化机械设备中重要的传动元件,提高支撑座的效率对于自动化机械设备的可持续发展和企业的竞争力具有重要意…

2024华数杯国际赛A题B题思路及代码!

大家好,这里是本次华数杯国际数学建模竞赛的AB题思路代码讲解贴。 关于思路,可以移步我的视频讲解: 2024华数杯国际赛数学建模选题建议及初步思路!_哔哩哔哩_bilibili 本篇主要讲解代码。 问题A:日本放射性废水 对…

Springboot+vue的智能家居系统(有报告),Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的智能家居系统(有报告),Javaee项目,springboot vue前后端分离项目 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的智能家居系统,采用M(model&a…

二叉树的概念|满二叉树与完全二叉树|二叉树的性质|二叉树的存储结构

前言 在数据结构中树的用途其实并不大,用得更多的其实是二叉树。所以在本章我们将详细讲解二叉树。 一、二叉树的概念及结构 1、概念 一颗二叉树是结点的一个有限集合,该集合: 或者为空或者由一个根节点加上两颗(互不相交&…

云计算入门——Linux 命令行入门

云计算入门——Linux 命令行入门 前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。 介绍 如今,我们许多人都熟悉计算机(台式机和笔记本电…

VMware workstation安装SUSE Linux Enterprise Server 12 SP5虚拟机并配置网络

VMware workstation安装SUSE Linux Enterprise Server 12 SP5虚拟机并配置网络 SUSE Linux Enterprise Server是企业级Linux系统,适合企业应用。该文档适用于在VMware workstation平台安装SUSE Linux Enterprise Server虚拟机。 1.安装准备 1.1安装平台 Windows…

嵌入式-Stm32-江科大基于标准库的GPIO的八种模式

文章目录 一:GPIO输入输出原理二:GPIO基本结构三:GPIO位结构四:GPIO的八种模式道友:相信别人,更要一百倍地相信自己。 (推荐先看文章:《 嵌入式-32单片机-GPIO推挽输出和开漏输出》…

docker安装elk(Elasticsearch+logstash+kibana)

1. 安装Docker 如果您还没有安装Docker,请先安装Docker。您可以按照官方文档进行安装:https://docs.docker.com/engine/installation/ 安装 docker-ce [rootk8s-master ~]# yum install docker-ce -y [rootk8s-master ~]# systemctl start docker &am…

力扣● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

● 435. 无重叠区间 跟弓箭题一样的原理:先集体对左边界排序,然后从第1个区间开始,当下一个区间的左边界比该区间的右边界要小的时候,就得去掉这个区间(count),然后应该①直接更新该区间的右边…

Java根据模板文件生成excel文件,同时将excel文件转换成图片

需求 需要将指定数据导出成表格样式的图片&#xff0c;如图 业务拆解 定义一个导出模板将得到的数据填入模板中&#xff0c;生成excel文件将ecxel文件转换成png格式的图片 代码实现 需要引入的依赖 <dependency><groupId>cn.hutool</groupId><artif…

架构篇04-复杂度来源:高性能

文章目录 单机复杂度集群的复杂度小结 从本篇开始&#xff0c;我们一起深入分析架构设计复杂度的 6 个来源&#xff0c;先来聊聊复杂度的来源之一高性能。 对性能孜孜不倦的追求是整个人类技术不断发展的根本驱动力。例如计算机&#xff0c;从电子管计算机到晶体管计算机再到集…

难道说 IT行业的下一个风口是鸿蒙开发吗?

按往年的习俗&#xff0c;在年底之季有很多HC都会缩减&#xff0c;尤其当下各种裁员的情况下&#xff0c;不管你是在哪个传统开发行业&#xff0c; 如&#xff1a;C/C、Java、前端、后端……等多少都会一股互联网寒流的影响。而今年却出现了一个怪现象&#xff0c;有个岗位在这…

AI客服发展现状与展望:期待技术进步带来更优质的服务体验

近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;越来越多的企业开始采用AI客服&#xff0c;以提高效率、降低成本。然而&#xff0c;一些用户反映AI客服存在回答不准确、难以理解个性化问题等问题&#xff0c;引发了对智能客服发展现状的关注。 在北京市民邹女士的…

网页设计(六)表格与表格页面布局

一、设计《TF43: 前端的发展与未来》日程表 《TF43: 前端的发展与未来》日程表 文字素材&#xff1a; 前端是互联网技术的重要一环&#xff0c;自上世纪80年代万维网技术创立以来&#xff0c;Web成就了大量成功的商业公司&#xff0c;也诞生了诸多优秀的技术解决方案。因其标…

SimMIM: a Simple Framework for Masked Image Modeling

论文名称&#xff1a;SimMIM: a Simple Framework for Masked Image Modeling 发表时间&#xff1a;CVPR2022 开源地址&#xff1a; 开源代码 作者及组织&#xff1a;Zhenda Xie, Zheng Zhang, Hu Han等&#xff0c;来自清华&#xff0c;微软亚洲研究院。 前言 本文提出一种新…