GORM的常见命令

news/2024/10/22 14:25:14/

文章目录

  • 一、什么是GORM?
  • 二、GORM连接mysql以及AutoMigrate创建表
  • 三、查询
    • 1、检索此对象是否存在于数据库(First,Take,Last方法)
    • 2、Find()方法检索
    • 3、根据指定字段查询
  • 四、更新
    • 1、Save() 保存多个字段
    • 2、更新单个字段
  • 五、删除

一、什么是GORM?

GORM 是 Go 语言中一个非常流行的 ORM(对象关系映射)库,它提供了一种简单而强大的方式来将 Go 结构体映射到数据库表,并提供了丰富的方法来操作数据库,比如查询、插入、更新和删除数据等。

mysqlAutoMigrate_5">二、GORM连接mysql以及AutoMigrate创建表

使用GORM之前先获取包:

go get "gorm.io/driver/mysql"
go get "gorm.io/gorm"

数据库的连接:

	db, _ = gorm.Open(mysql.New(mysql.Config{DSN: "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local",}), &gorm.Config{SkipDefaultTransaction:                   true, // 禁用默认事务(提高运行速度)DisableForeignKeyConstraintWhenMigrating: true, // 禁用外键约束NamingStrategy: schema.NamingStrategy{//TablePrefix:   "t_", // 表名前缀,`User` 的表名应该是 `t_users`SingularTable: true, // 使用单数表名,启用该选项},})

使用AutoMigrate自动创建表,在这里我们就要知道GORM里的模型是什么意思。
模型是使用普通结构体定义的。
也就是说,数据库中的表是根据我们自己建立的结构体生成的,我们可以在设计结构体的时候,在后边加上gorm的一些限制,然后自动迁移就可以在数据库中生成了。

gorm.Model

type Model struct {ID        uint `gorm:"primarykey"`CreatedAt time.TimeUpdatedAt time.TimeDeletedAt DeletedAt `gorm:"index"`
}

这是gorm已经定义好的结构体,可以直接使用。

案例1:创建一个用户表自动迁移到数据库中。

type User struct {gorm.ModelName stringAge  int
}func main() {db.AutoMigrate(&User{}) //自动迁移这个表user := User{Name: "张三",Age:  18,}rest := db.Create(&user)fmt.Println(user.ID) // 主键IDfmt.Println(rest.RowsAffected)fmt.Println(rest.Error)
}

案例2:自动创建一个嵌套的表组合。

type User struct {gorm.ModelName stringAge  int
}type Work struct {UserWork string
}func main() {err := db.AutoMigrate(&Work{}) //自动迁移这个表if err != nil {fmt.Println(err)}work := Work{User: User{Name: "张三", Age: 18}, Work: "程序员"}db.Create(&work)fmt.Println(work.ID)
}

三、查询

以下所有操作的基本数据库信息如下:
在这里插入图片描述

1、检索此对象是否存在于数据库(First,Take,Last方法)

GORM 提供了First、Take、Last方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1 条件,且没有找到记录时,它会返回 ErrRecordNotFound 错误。

	//查询张三是否在数据库中//SELECT * FROM `work` WHERE name = '张2三' AND `work`.`deleted_at` IS NULL ORDER BY `work`.`id` LIMIT 1var work1 Workresult := db.Where("name = ?", "张三").First(&work1)if result.Error != nil {if errors.Is(result.Error, gorm.ErrRecordNotFound) {fmt.Println("没找到记录")return}fmt.Println(result.Error)return}fmt.Println(result.RowsAffected) // 受影响的行数

2、Find()方法检索

	// 查询age=20的所有的信息var works []Workresult = db.Where("age = ?", 20).Limit(1).Find(&works)if result.Error != nil {if errors.Is(result.Error, gorm.ErrRecordNotFound) {fmt.Println("没找到记录")return}fmt.Println(result.Error)return}fmt.Println(result.RowsAffected)for i, work := range works {fmt.Println(i, work)}

3、根据指定字段查询

	// 指定结构体查询字段var work2 []Workresult11 := db.Select("name,age").Where("age = ?", 20).Limit(2).Find(&work2)if result.Error != nil {if errors.Is(result11.Error, gorm.ErrRecordNotFound) {fmt.Println("没找到记录")return}fmt.Println(result11.Error)return}fmt.Println(result11.RowsAffected)for i, work := range work2 {fmt.Println(i, work)}

四、更新

1、Save() 保存多个字段

Save 会保存所有的字段,即使字段是零值

保存 是一个组合函数。 如果保存值不包含主键,它将执行 Create,否则它将执行 Update (包含所有字段)。

	works := []Work{{User: User{Name: "张三", Age: 18}, Work: "程序员"},{User: User{Name: "李四", Age: 19}, Work: "程序员"},{User: User{Name: "王五", Age: 20}, Work: "程序员"},}result := db.Save(works)if result.Error != nil && result.RowsAffected == 0 {fmt.Println("保存失败")return}fmt.Println("保存成功")

2、更新单个字段

可以使用主键查询也可以是使用某个特定的字段查询,也可以同时使用查询。

	// 根据表的name进行修改信息result := db.Model(&Work{}).Where("name=?", "张三").Updates(map[string]interface{}{"age": 112, "work": "大佬"})if result.Error != nil {panic(result.Error)}if result.RowsAffected == 0 {panic("没有更新数据")}fmt.Println(result.RowsAffected)// 根据id修改信息var w Workw.ID = 1result = db.Model(&w).Updates(map[string]interface{}{"age": 32, "work": "行长"})if result.Error != nil {panic(result.Error)}if result.RowsAffected == 0 {panic("没有更新数据")}fmt.Println(result.RowsAffected)

五、删除

如果你的模型包含了 gorm.DeletedAt字段(该字段也被包含在gorm.Model中),那么该模型将会自动获得软删除的能力!

当调用Delete时,GORM并不会从数据库中删除该记录,而是将该记录的DeleteAt设置为当前时间,而后的一般查询方法将无法查找到此条记录。

软删除:

	// 根据主键删除var w Workw.ID = 7// db.Delete(&Work{}, 8) //一样的result := db.Where("age < ?", 98).Delete(&w)if result.Error != nil {panic(result.Error)}if result.RowsAffected == 0 {panic("没有删除任何数据")}fmt.Println(result.RowsAffected)

物理删除:

// 物理删除主键为 5 6的两条信息
db.Unscoped().Delete(&Work{}, 5, 6)

http://www.ppmy.cn/news/1457766.html

相关文章

花一个月时间为 vue3 重制了 vue-styled-components

花一个月时间为 vue3 重制了 vue-styled-components 前言 styled-components 在 React 是一个超级热门的 css in js 工具库。其实 styled-components 也有 Vue 版本&#xff08;vue-styled-components&#xff09;&#xff0c;可惜的是只支持 Vue2&#xff0c;并且该项目已有…

浅谈自己用过最好用的AI工具概括

个人最经常用的AI工具的其实是Copilot&#xff0c;但是也有别的一些最好用的AI工具&#xff0c;包括&#xff1a; OpenAI GPT-3&#xff1a;这是一个自然语言生成模型&#xff0c;具有强大的语言理解和生成能力。它可以用于各种任务&#xff0c;如文字生成、自动回复和文本摘要…

Java 【数据结构】常见排序算法实用详解(下) 冒泡排序/快速排序/归并排序/非基于比较排序【贤者的庇护】

登神长阶 上古神器-常见排序算法 冒泡排序/快速排序/归并排序/非基于比较排序 &#x1f4b0;一.前言 为保障知识获取的可读性&#xff0c;以及连贯性&#xff0c;再开始可以适当的重新温习前文内容 &#xff1a;Java 【数据结构】常见排序算法实用详解&#xff08;上&#xf…

c/c++:山顶元素

题目描述(题目链接) 从键盘输入一个整型二维数组&#xff0c;遍历二维数组中的每个元素&#xff0c;如果此元素比其上下左右的数字都大&#xff0c;即为山顶元素。 输入格式 一个≥1的整数&#xff0c;表名是几行几列的二维数组&#xff0c;一个整型二维数组&#xff0c;数据…

Dropout作为贝叶斯近似: 表示深度学习中的模型不确定性

摘要 深度学习工具在应用机器学习领域受到了极大的关注。然而&#xff0c;这些用于回归和分类的工具并没有捕捉到模型的不确定性。相比之下&#xff0c;贝叶斯模型提供了一个基于数学的框架来推理模型的不确定性&#xff0c;但通常会带来令人望而却步的计算成本。本文提出了一…

【从零开始学习Minio | 第一篇】快速介绍什么是Minio

前言&#xff1a; 在当今数字化时代&#xff0c;数据的存储和管理已经成为了企业发展中的关键一环。随着数据量的不断增长和数据安全性的日益受到重视&#xff0c;传统的数据存储解决方案往往面临着诸多挑战。为了应对这些挑战&#xff0c;云存储技术应运而生&#xff0c;并在…

go Gin项目实战

Gin项目实战 Gin博客项目-项目架构Gin博客项目-集成gormGin博客项目-集成Bootstrap创建用户表单Gin 博客项目-实现控制器和路由Gin 博客项目-设计静态页面Gin 博客项目-用户注册Gin 博客项目-用户登录Gin 博客项目-集成markdown编辑器Gin 博客项目-创建博客模型和DAOGin 博客项…

Chrome命令大师:揭秘浏览器中的隐藏神器,提升你的上网效率!

Google Chrome是一款功能强大的浏览器&#xff0c;除了常规的网页浏览功能外&#xff0c;它还提供了许多实用的命令&#xff0c;可以帮助我们更高效地使用浏览器。本文将详细介绍一些常用的Chrome浏览器命令&#xff0c;包括它们的介绍、命令或语法、作用以及使用方法等。 打开…