导读
本套笔记是学习完Gin框架之后的下一个阶段,通过Gin框架我们可以很方便的和前端进行交互,下一步就是和数据库进行交互,这就需要使用GORM。本套笔记就是带你快速上手GORM,学习完这个之后就可以完成大项目的开发了,后续还会进行大项目的讲解开发,制作不易,喜欢的就点个关注吧。
本套课程基于GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.进行讲解,是对这个的补充解释说明。
注意
代码详解大部分是注释的形式给出,请留意代码注释。
GORM介绍
GORM(Go Object Relational Mapping)是一个在 Go 语言中使用的优秀的 ORM(对象关系映射)库。它提供了简单且强大的 API,使开发人员能够轻松地与数据库进行交互
删除一条记录
我们的数据库里面有这样的一个记录
要删除的话只需要书写
result := db.Where("name = ?", "jinzhu").Delete(&Email{})
完整代码
package main import ( "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" ) type Email struct { ID uint Name string Email string } //Email的表 func main() { db, _ := gorm.Open(mysql.New(mysql.Config{ DSN: "root:Lycdemima1@@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local", // DSN data source name DefaultStringSize: 256, // string 类型字段的默认长度 DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持 DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引 DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列 SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置 }), &gorm.Config{}) //连接数据库 result := db.Where("name = ?", "jinzhu").Delete(&Email{})//删除记录 fmt.Println(result) }
运行之后我们就会发现记录被删除了
根据主键删除
GORM 允许通过主键来删除对象,它可以使用数字
db.Delete(&User{}, 10)//删除id为10的记录 db.Delete(&User{}, "10")//删除id为10的记录 db.Delete(&users, []int{1,2,3})//删除id为1,2,3的记录
钩子函数
删除之前运行
func (u *User) BeforeDelete(tx *gorm.DB) (err error) { if u.Role == "admin" { return errors.New("admin user not allowed to delete") } return }
删除之后运行
func (u *User) AfterDelete(tx *gorm.DB) (err error) { if u.Role == "admin" { return errors.New("admin user not allowed to delete") } return }
软删除
软删除是一种在数据库中标记记录为已删除而不是实际删除的技术
通常是一个名为 deleted
或类似的字段
如果你的模型包含了 gorm.DeletedAt
字段(该字段也被包含在gorm.Model
中),那么该模型将会自动获得软删除的能力。
type User struct { ID int Deleted gorm.DeletedAt Name string }
当调用Delete
时,GORM并不会从数据库中删除该记录,而是将该记录的DeleteAt
设置为当前时间,而后的一般查询方法将无法查找到此条记录
查找被软删除的记录
可以使用Unscoped
来查询到被软删除的记录
db.Unscoped().Where("age = 20").Find(&users) //找到这一条数据
永久删除
可以使用 Unscoped
来永久删除匹配的记录
//"condition_column" 是用于指定删除条件的列名,"conditionValue" 是该列的值 db.Unscoped().Where("condition_column = ?", conditionValue).Delete(&Model{})