什么是ORM
ORM是Object Relational Mapping,即“对象关系映射”,用于解决对象与关系型数据库之间的数据交互问题
- 大意就是使用一个类来表示一张表,类中的属性表示表的字段,类的实例化对象表示一条记录
- 使用对象的方法控制数据库
什么是GORM
为了提高使用Go语言开发数据库应用的速度和效率,引入了GORM。GORM是一个功能完善且易于使用的ORM框架。其主要用途是把struct类型与数据库表进行映射,因此,在使用GORM时一般不需要直接手写SQL代码
GORM的使用
一、准备GORM
- GORM的下载以及安装:Gorm 框架 Github 地址: github.com/go-gorm/gor…
- 如果项目依赖包不适用go mod管理,那么就需要手动下载依赖包:
go get -u gorm.io/driver/mysql //安装MySql驱动包
go get -u gorm.io/gorm //安装Gorm包
- 并在代码中导入依赖包
import (
"gorm.io/driver/mysql"
"gorm.io/gorm "
)
二、定义模型(类)
操作数据库需要数据模型作为媒介,所以GORM框架在操作数据库前首先需要定义数据模型
- gorm.Model结构体
type Model struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
- 模型定义示例(Gun类),嵌入gorm.Model
type Gun struct {
gorm.Model
Name string //表字段名为name
Id int //表字段名为id
SpawnProbability float64 //表字段名为spawn_probability
DamagePerBullet int //表字段名为damage_per_bullet
BulletCapacity int //表字段名为bullet_capacity
}
三、连接数据库
GORM使用dsn作为连接数据库的参数。dsn中一般包含数据库连接地址、账号、密码之类的信息
- 配置MySql连接参数
username := "gorm_user"
password := "admin"
host := "127.0.0.1"
port := "3306"
Dbname := "gorm_database"
- 拼接dsn参数,使用Sprintf动态拼接dsn参数,因为一般情况下数据库连接参数都保存在配置文件中,需要从文件中加载再拼接dsn
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, port, Dbname)
- 使用gorm.Open连接MySql
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("Failed to connect, error = " + err.Error())
}
四、插入数据
- 定义一个类实例,并初始化数据
newGun := Gun {
Name: "R301"
Id: "114514"
SpawnProbability: "0.1"
DamagePerBullet: "14"
BulletCapacity: "28"
}
- 插入一条数据
db.Create(&newGun)
if err := db.Create(&newGun).Error; err != nil {
fmt.Println("Failed to insert, err = ", err)
return
}
五、查询数据
查询数据的方法众多,GORM提供了功能多样的查询函数,以下以Take函数查询一条数据为例
- db.Take()
gunCheck := Gun{}
db.Take(&gunCheck) //等价于 SELECT * FROM 'Gun' LIMIT 1
- 查询错误处理
if err := db.Take(&gunCheck).Error; err != nil {
fmt.Println("Failed to search, err = ", err)
}
六、更新数据
- Save方法更新
tempGun := Gun{}
db.Where("id = ?", 114514).Take(&tempGun) //查询一条id为114514的数据,保存在模型变量tempGun
tempGun.SpawnProbability = 0.2 //修改tempGun的值
db.Save(&tempGun)
- Updates方法更新()
tempGun := Gun{}
db.Model(&tempGun).Update("SpawnProbability", 0.2) //以Gun模型的主键值作为Where条件,更新spawn_probability字段值,此方法只更新一条记录
db.Model(&Gun{}).Update("SpawnProbability", 0.2) //Gun{}的主键为空,where语句即为空,此时更新全部记录
db.Model(&Gun{}).Where().Update("SpawnProbability", 0.2) //在Where语句中自定义条件更新记录
tempUpdateData := Gun{
Name: "VK47"
Damage: 18
}
//如若要更新多个字段值,则使用一个结构体变量暂存更新值,并将地址传入Update函数即可
db.Model(&tempGun).Update(&tempUpdateData)
七、删除数据
GORM删除数据使用db.Delete()
- 例如删除上文更新的数据(VK47)
db.Where("Name = ?", "VK47").Delete(&Gun{}) //在Gun表中查找Name为VK47的记录并删除
小结
总的来说,GORM是一个功能完善使用简单的框架,在使用Go语言开发数据库应用中使用GORM框架可以很大地提高开发效率,简化代码。不用手写SQL语言也在一定程度上降低了开发难度,使得操作数据库变得简单高效。