在我们进行数据的交互时,实现数据的持久化是相关重要的。在这里,我们使用 GORM 这个强大的 Go 语言 ORM 库来简化数据库操作。
一、简介
Gorm是一个基于Go语言的对象关系映射(ORM)框架。ORM框架用于简化数据库操作,将数据库表映射到程序中的对象,并提供了一种简洁的方式来执行数据库查询、插入、更新和删除等操作。
Gorm提供了丰富的功能,包括:
- 数据库驱动支持:Gorm兼容多种数据库驱动,如MySQL、PostgreSQL、SQLite等。
- 模型定义:您可以通过定义结构体来表示数据库表,Gorm会根据模型定义自动生成对应的数据库表结构。
- CRUD操作:Gorm提供了一套简洁的API,可以方便地执行创建、读取、更新和删除操作。
- 查询构建器:您可以使用链式调用方式构建复杂的数据库查询语句。
- 关联关系管理:Gorm支持定义和管理表之间的关联关系,如一对一、一对多、多对多等。
- 事务处理:Gorm提供了事务机制,确保在复杂操作中的数据一致性和完整性。
- 钩子函数:您可以在执行数据库操作前后添加自定义的钩子函数,以实现额外的逻辑。
二、Gorm连接数据库
开始前,我们安装了mysql驱动。参考gorm中文文档https://gorm.cn/zh_CN/docs/migration.html中的mysql部分。
要使用GORM连接数据库,我们首先需要导入gorm.io/gorm和gorm.io/driver/mysql两个包,分别提供了GORM的核心功能和MySQL驱动。
import (
//数据库连接池
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/schema"
)
接下来,我们使用gorm.Open()函数来打开一个数据库连接,它接受两个参数:一个是数据库驱动,一个是数据源名称(DSN)。DSN是一个字符串,用于指定数据库的地址、端口、用户名、密码、名称等信息。如果连接成功,gorm.Open()函数会返回一个*gorm.DB类型的值,它代表了一个数据库连接会话,通过它来执行后续的数据库操作。
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
下面我们连接本机数据库
////数据库 用户、密码、地址(127.0.0.1就是本机的localhost),数据库名
dsn := "root:1234@tcp(127.0.0.1:3306)/studydatabase?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
然后对数据库连接的属性进行相关配置
sqlDB, err := db.DB()
if err != nil {
return
}
// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(10)
// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(100)
// SetConnMaxLifetime 设置了连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(10 * time.Second) //10秒钟
三、数据库表映射
我们对数据库表进行操作时,需要有golang中的结构体进行相应的对应。
/*
注意:结构体里面的变量首字母大写
gorm指定类型,json表示json字段名称,binding require表示必须输入
*/
type List struct {
//添加这句代码创建表时会自动添加主键,以及创建修改删除相关信息
gorm.Model
//binding:"require"是在运行时进行表单验证或数据绑定时使用的标签,而NOT NULL是在数据库定义中用于强制字段非空的静态约束。
Name string `gorm:"type:varchar(20);not null" json:"name" binding:"require"`
State string `gorm:"type:varchar(20);not null" json:"state" binding:"require"`
Phone string `gorm:"type:varchar(20);not null" json:"phone" binding:"require"`
Email string `gorm:"type:varchar(40);not null" json:"email" binding:"require"`
Address string `gorm:"type:varchar(200);not null" json:"address" binding:"require"`
}
除此之外,还有一些其他的关键字。
primaryKey表示该字段是主键,GORM会自动为其生成自增的值。size:表示该字段的最大长度字符。unique表示该字段具有唯一性约束,不能有重复的值。not null表示该字段具有非空约束,不能为NULL。
我们也可以使用其他标签来指定非GORM相关的属性,例如:
json:"..."表示该字段在JSON格式中的名称,用于序列化和反序列化。validate:"..."表示该字段的验证规则,用于数据校验。
四、CRUD相关基本操作
创建表
注意: AutoMigrate 会创建表,缺少的外键,约束,列和索引,并且会更改现有列的类型(如果其大小、精度、是否为空可更改)。但 不会 删除未使用的列,以保护您的数据。
如果表不存在,AutoMigrate()方法会创建一个新的表;如果表已经存在,它会根据模型的变化来更新表结构,但不会删除已有的列和数据。如果创建或更新失败,它会返回一个错误值
db.AutoMigrate(&List{})
下面的就是 CRUD(Create、Read、Update、Delete)基本操作:
创建数据
我们可以使用GORM的Create()方法来向表中插入一条或多条记录。它接受一个或多个模型实例作为参数,然后根据模型的定义来生成对应的SQL语句,并执行它们。
list=List{
"name": "张三",
"state": "在职",
"phone": "123456789",
"email": "123456789@qq.com",
"address": "山西省"
}
result := db.Create(list)
如果插入成功,Create()方法会返回一个*gorm.DB类型的值,它包含了执行结果的相关信息,例如:
RowsAffected表示影响的行数,即插入的记录数。Error表示执行过程中发生的错误,如果没有错误,则为nil。PrimaryValue表示插入记录的主键值,如果有多个主键,则为第一个主键值。
查询数据
使用Where()方法来指定过滤条件,它接受一个字符串、一个结构体、一个字典或一个切片作为参数,然后根据参数的类型和内容来生成对应的SQL语句,并执行它们。
使用Find()方法来查询多条记录,它接受一个切片的指针作为参数,然后将查询结果追加到该切片中。
例如:
//查询满足条件的信息,将其追加到data中
db.Where("id=?", id).Find(&data)
使用First()方法来查询第一条记录,它接受一个结构体的指针作为参数,然后将查询结果赋值给该结构体。
// 查询第一条信息,并将结果赋值给data结构体
db.First(&data)
使用Last()方法来查询最后一条记录,它接受一个结构体的指针作为参数,然后将查询结果赋值给该结构体。
// 查询最后一条信息,并将结果赋值给data结构体
db.Last(&data)
使用Count()方法来统计记录数,它接受一个整数的指针作为参数,然后将查询结果赋值给该整数。例如:
var count int
// 统计所有用户的数量,并将结果赋值给count变量
db.Model(&List{}).Count(&count)
// 统计姓名为"张三"的用户的数量,并将结果赋值给count变量
db.Model(&List{}).Where("name = ?", "张三).Count(&count)
更新数据
在从表中查询了记录之后,我们可以使用GORM的Update()方法来修改一条或多条记录。它接受一个字符串、一个结构体、一个字典或一个函数作为参数,然后根据参数的类型和内容来生成对应的SQL语句
//修改指定id的用户信息
db.Where("id=?", id).Updates(&data)
删除数据
在从表中查询了记录之后,我们可以使用GORM的Delete()方法来删除一条或多条记录。
//删除指定id的用户信息
db.Where("id=?", id).Delete(&data)
// 删除所有用户信息
db.Delete(&List{})