Gorm 实践:使用 gorm.ErrRecordNotFound 判断元组是否存在

Gorm 提供了很多错误类型给我们使用,今天我们介绍较为常见的 gorm.ErrRecordNotFound,我们将用其实现较为常见的存在性判断逻辑。之所以常见,是因为我们常需要使用存在性判断,来避免使用不存在的结果的结果集或重复插入数据行。

我们知道 Gorm 的查询会返回 *gorm.DB,而 *gorm.DB 中存在的 Error 字段边携带我们需要的错误信息,我们实现的方式便是使用查询返回的 *gorm.DB 获取 Error 字段信息,然后用该信息和 gorm 的 errors.go 文件中定义的 ErrRecordNotFound 错误进行比对,来确定我们的查询是否不存在记录。

go 复制代码
errors.Is(result.Error, gorm.ErrRecordNotFound)

errors 的 Is API 会比对错误,如果匹配则返回 true,否则 false。

核心知识点介绍完毕,下面是实践部分。

我们使用 sqlite 配合 gorm 的自动迁移来完成我们的实践,首先我们需要最典型的数据表 User 表:

go 复制代码
type User struct {
    gorm.Model
    Name    string
    Email   string `gorm:"type:varchar(100);unique_index"`
}

然后是用于核心代码 CheckExist 函数:

go 复制代码
// CheckExist 使用 gorm.ErrRecordNotFound 检查符合某些条件的元组是否存在
func CheckExist(db *gorm.DB, name string) bool {
	var user User
	result := db.Where("Name = ?", name).First(&user)
	// 使用 gorm.ErrRecordNotFound 检查是否存在记录
	return !errors.Is(result.Error, gorm.ErrRecordNotFound)
}

在 CheckExist 中,我们使用 Where API 查询名字匹配的第一条记录,然后 result 会被赋予其返回值,接下来便是使用 Is 比对错误,因为我们这个函数的目的是检查记录是否存在,所以逻辑是如果错误匹配则取反返回 false 否则返回 true。

然后便是使用 sqlite 驱动建立连接,使用自动迁移建立 sqlite 表结构

go 复制代码
func main() {
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }

    // 自动迁移以适配User模型
    db.AutoMigrate(&User{})
}

因为需要比对存在数据和不存在数据两种结果,所以我们在封装一个 TestCheckExist 减少重复。

go 复制代码
func TestCheckExist(db *gorm.DB, name string) {
	if CheckExist(db, name) {
		fmt.Println("Exist.")
	} else {
		fmt.Println("Not Exist")
	}
}

最后便是测试 CheckExist 是否能正常工作,分别在数据库不存在对应字段和存在字段两种情况下进行测试:

go 复制代码
func main() {
    // ... 建立连接等
        // 自动迁移以适配User模型
    db.AutoMigrate(&User{})

	TestCheckExist(db, "CodeSinger")

	// 新增列
	user := &User {
		Name: "CodeSinger",
		Email: "xxx.qq.com",
	}
	db.Create(&user)

	TestCheckExist(db, "CodeSinger")
}

结果:

go 复制代码
record not found
[0.051ms] [rows:0] SELECT * FROM `users` WHERE Name = "CodeSinger" AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1
Not Exist
Exist.

可以看到在没有该记录的情况下输出 Not Exist,在插入记录之后输出 Exist,表明判断逻辑正确。

ps: 这里除了我们自己的输出外的内容是 Gorm 的日志信息。

相关推荐
久违 °3 小时前
【AI-Agent】TagMatrix 数据标注工具开发
人工智能·数据分析·go·agent·数据隐私
小羊在睡觉3 小时前
力扣84. 柱状图中最大的矩形
后端·算法·leetcode·golang·go
ccddsdsdfsdf3 小时前
DBeaver怎么链接mongoDB
数据库·mongodb
丷丩4 小时前
Postgresql基础实践教程(十一)各种Join
数据库·postgresql·join
星夜夏空995 小时前
FreeRTOS学习(4)——内存映射
数据库·学习·mongodb
TheRouter5 小时前
AI Agent 记忆体系建设实战:短期、长期与工作记忆的工程实现
数据库·人工智能·oracle
Omics Pro5 小时前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言
JAVA面经实录9176 小时前
Hibernate面试题库
数据库·oracle·hibernate
迷枫7127 小时前
DM8 目录结构与常用排查入口梳理
服务器·数据库
Mr.Daozhi8 小时前
RAG 进阶实战:跑通 Demo 后我连续翻了 6 次车,逐一修复才真正可用(含 Gradio Web 版)
前端·数据库·langchain·大模型·gradio·rag·科研工具