30 lines
788 B
Go
30 lines
788 B
Go
|
|
/**
|
|||
|
|
* package utils
|
|||
|
|
* 作用:数据库相关的通用工具函数
|
|||
|
|
*/
|
|||
|
|
package utils
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"errors"
|
|||
|
|
"strings"
|
|||
|
|
|
|||
|
|
"gorm.io/gorm"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* IsDuplicateEntryError
|
|||
|
|
* 功能:判断是否为唯一索引冲突错误(MySQL 错误码 1062)。
|
|||
|
|
* 为什么需要:依赖唯一索引做并发兜底的写入(如点赞、消息删除记录)
|
|||
|
|
* 需要把"重复插入"当作幂等成功处理。GORM 的 ErrDuplicatedKey 依赖驱动
|
|||
|
|
* Translate 支持,部分配置下返回的是原始 mysql 错误,需按错误文本兜底判断
|
|||
|
|
*/
|
|||
|
|
func IsDuplicateEntryError(err error) bool {
|
|||
|
|
if err == nil {
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
if errors.Is(err, gorm.ErrDuplicatedKey) {
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
return strings.Contains(err.Error(), "Duplicate entry") || strings.Contains(err.Error(), "1062")
|
|||
|
|
}
|