一、定义表模型时区问题

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
}

Gorm 应用开发时区问题与unique唯一索引字段数据冲突问题的更多相关文章

  1. mysql,sql server,oracle 唯一索引字段是否允许出现多个 null 值?

    最近一个项目,涉及到sql server 2008,因为业务需求,希望建立一个唯一索引,但是发现在sql server中,唯一索引字段不能出现多个null值,下面是报错信息: CREATE UNIQU ...

  2. Mysql索引介绍及常见索引(主键索引、唯一索引、普通索引、全文索引、组合索引)的区别

    Mysql索引概念:说说Mysql索引,看到一个很少比如:索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不是越多越好,假如这本书1000页,有500也是目录,它当然效率低,目录是要 ...

  3. Mysql主键索引、唯一索引、普通索引、全文索引、组合索引的区别

    原文:Mysql主键索引.唯一索引.普通索引.全文索引.组合索引的区别 Mysql索引概念: 说说Mysql索引,看到一个很少比如:索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不 ...

  4. 使用SQL创建唯一索引

    使用sql语句创建唯一索引,格式如下: create unique index 索引名 on 表名(列名1,列名2……) 示例:在表GoodsMade_Labour的SID列上创建唯一索引IX_Goo ...

  5. 唯一索引的一种使用情景【有则U无则I】

    这个知识点是最近一位面试老师问我的,当时对这种方法不了解,所以只能说那个中效率低的方法了,也就是先进性select判断,然后在执行更新或者插入操作,显然这种是很麻烦的,也自我反思一下,确实有很多的知识 ...

  6. Mysql添加和删除唯一索引、主键

    1.PRIMARY KEY(主键索引) 添加 ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` );删除 ALTER TABLE `table_n ...

  7. mysql创建唯一索引

    查看索引  show index from 数据库表名 alter table 数据库add index 索引名称(数据库字段名称) PRIMARY KEY(主键索引) ALTER TABLE `ta ...

  8. 【mysql】主键、普通索引、唯一索引和全文索引的比较

    YSQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录 开始扫描整个表的所有记录,直至找到符合要求的记录.表里面的记 ...

  9. mysql多字段唯一索引

    项目中需要用到联合唯一索引: 例如:有以下需求:每个人每一天只有可能产生一条记录:处了程序约定之外,数据库本身也可以设定: 例如:user表中有userID,userName两个字段,如果不希望有2条 ...

  10. Mysql唯一索引线上故障记录

    问题现象: Mysql插入一条数据时,未指定自增键的值却报错:自增键重复,无法插入! 执行SQL INSERT INTO `test`.`test_sort`(`id`, `name`, `age`, ...

随机推荐

  1. 火山引擎数智平台 VeDI 帮助智能投影仪更懂用户需求

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 当露营成为年轻人的一种全新生活方式后,连带着户外野营帐篷.可折叠桌椅.卡式炉.多人趣味桌游等露营周边市场都迎来新一 ...

  2. Mysql--表注释,字段注释

    information_schema数据库是MySQL数据库自带的数据库,里面存放的MySQL数据库所有的信息,包括数据表.数据注释.数据表的索引.数据库的权限等等. 1.添加表.字段注释 creat ...

  3. MB51增强

    一.在MB51报表中新增列 包含文件RM07DOCS_GENERATED的itab结构中,新增字段 在RM07DOCS中的detail_list子例程中添加查询逻辑 在子例程build_fieldca ...

  4. Python报错:TypeError: 'dict_keys' object does not support indexing(机器学习实战treePlotter代码)解决方案

    错误信息: 学习<机器学习实战>这本书时,按照书上的代码运行,产生了错误,但是在代码中没有错误提示,产生错误的代码如下: firstStr = myTree.keys()[0] print ...

  5. The 18th Zhejiang Provincial Collegiate Programming Contest 补题记录(ACFGJLM)

    补题链接:Here A. League of Legends 签到题,求和判断即可 ll suma, sumb; void solve() { ll x; for (int i = 1; i < ...

  6. 活动回顾|阿里云云原生 Serverless 技术实践营 深圳站回放&PPT下载

    11月24日"阿里云云原生 Serverless 技术实践营"深圳站圆满落幕.活动受众以关注  Serverless 技术的开发者.企业决策人.云原生领域创业者为主,活动形式为演讲 ...

  7. <vue 路由 7、导航守卫>

    导航守卫 一.     知识点 1.什么是导航守卫? (1)vue-router提供的导航守卫主要用来监听路由的进入和离开. (2)vue-router提供了beforeEach和afterEach的 ...

  8. springboot升级到2.6.x和2.7.x 兼容hystrix

    一.pom.xml需要引入的依赖 二.项目开启熔断器开关 2.1 注解方式 2.2 xml方式 三.依赖类缺失问题 四.版本匹配安全检查问题 五.测试验证 六.结论 一.pom.xml需要引入的依赖 ...

  9. 08-Shell计算命令

    1.expr命令 expr (evaluate expressions 的缩写),译为"表达式求值".Shell expr 是一个功能强大,并且比较复杂的命令,它除了可以实现整数计 ...

  10. Java项目配置Maven依赖时不知需要的最低jdk版本?(报错java: 错误: 无效的目标发行版:17)

    1.问题 在配置SpringBoot项目依赖时,使用了最新的spring-boot-starter-parent 3.1.5,但是出现了java: 错误: 无效的目标发行版:17的报错 2.解决 经过 ...