这是我参与「第五届青训营」伴学笔记创作活动的第 19 天
从0到1教程,突出一个手把手傻瓜式。
GORM 简介
GORM 是GO语言的 ORM框架
什么是 ORM
- Object 对象:程序中的对象实例
- Relational 关系:关系型数据库
- Mapping 映射
原生 go 操作数据库需要在程序中手写 SQL 语句,但是有了 ORM ,开发者就可以以一种编程式的思维去操作数据库
安装
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
GORM 模型
- 数据表---结构体
- 数据行---结构体实例
- 字段---结构体字段
GORM优缺点
- 提高开发效率
- 牺牲执行性能
- 牺牲灵活性
- 弱化SQL能力
type UserInfo struct {
ID uint `gorm:"primary_key"`
Name string `gorm:"type:varchar(100);not null"`
Gender string `gorm:"type:varchar(10);not null"`
Hobby string `gorm:"type:varchar(100);not null"`
}
连接数据库
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{})
// 创建表,自动迁移
db.AutoMigrate(&UserInfo{})
- user:用户名
- pass:密码
- @(loaclhost:3306) 这样写可以省略tcp
- dbname:数据库名
- charst:编码
- parsetTime:是否解析时间类型 time.Time
CRUD
增
db.Create(UserInfo{ID: 1, Name: "坤坤", Gender: "男", Hobby: "篮球"})
查
var user UserInfo
db.First(&user)
fmt.Println(user)
更新
var user UserInfo
db.First(&user)
db.Model(&user).Update("hobby", "足球")
删除
var user UserInfo
db.First(&user)
db.Delete(&user)
GORM Model
gorm.Model 是 gorm 提供的基础模型,利用go的结构体嵌套,就可以使用,方便开发者注重业务信息,而不是这些基础内容。当然可以自己定义一个基础模型。
type Model struct {
ID uint `gorm:"primary_key"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt *time.Time
}
使用 gorm.Model 如下
type User struct {
gorm.Model
Name string
Age sql.NullInt64
}
设置主键
type Animal struct {
AnimalID int64 `gorm:"primary_key"`
Name string
Age int64
}
设置表名
type User struct {} // 默认表名是 `users`
// 1.将 User 的表名设置为 `profiles`
func (User) TableName() string {
return "profiles"
}
// 2.使用User结构体创建名为`deleted_users`的表
db.Table("deleted_users").CreateTable(&User{})
修改列名
type User struct {
ID uint // column name is `id`
Name string // column name is `name`
Birthday time.Time // column name is `birthday`
CreatedAt time.Time // column name is `created_at`
}
个人总结
对简单查询使用 GORM,但是对于要求性能或者语句复杂的,最好用原生 SQL。
更新和删除都要先进行查询,用指针传入查询参数,方便更新或者删除操作
增加用不用指针都可以
数据库需要事先创建好,表不需要, gorm 会自动创建,将结构体名转为蛇形后再加一个 s ,例如:user_infos。
orm 框架方便了开发的过程,但弱化了 SQL,这是需要小心点。因为复杂的情况或者有性能要求的情况都需要开发人员手写 SQL 语句,来保证特殊的需求。