这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记
课前资料
课程PPT:设计模式之 database sql与 GORM实践.pdf - 飞书云文档 (feishu.cn)
GORM简介
是当今比较热门的 golang 的orm操作数据库的工具,使用上主要是把 struct 类和数据库表进行映射,操作数据库时无需手写 sql。本质就是提供一组函数来帮助我们快速拼接 sql 语句,尽量减少 sql 的编写。 Github 地址:github.com/go-gorm/gor…
GORM安装
- mysql驱动包
// mysql 驱动go get -u gorm.io/driver/mysql - gorm包
// gormgo get -u gorm.io/gorm - 基本操作
- 使用 struct 定义模型,主要在 golang 中表示 mysql 的表
- gorm 创建数据库连接
- gorm 操作数据库
定义结构体
结构体
gorm默认使用 snake case,即 struct 中定义的变量名会自动识别成数据库表中下划线的列字段,比如说 CreateTime 就会被识别成数据表中的 create_time 列,所以需要在后面加上gorm:"column:createtime",gorm:"-"表示可以忽略该字段不参与数据表读写
// User 用户表
type User struct {
ID int64
Username string `gorm:"column:username"`
Password string `gorm:"column:password"`
// 时间戳
CreateTime int64 `gorm:"column:createtime"`
}
连接MySQL
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
func main() {
db, err := gorm.Open("mysql", "user:password@(localhost)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
defer db.Close()
}
GORM操作MySQL
新增数据:
type User struct {
gorm.Model
ID int `gorm:"primary_key"`
Name string `gorm:"not_null"`
}
func add() {
user := &User{Name:"David"}
db.Create(user)
}
删除数据
user := &User{ID:1}
db.Delete(user)
更新数据:
user := &User{ID:1}
db.Model(user).Update("Name","lisi")
查询数据:
//查询所有条目 var users []User
db.Find(&users)
fmt.Println(users)
//查询ID为1的条目
user := new (User)
db.First(user,1)
fmt.Println(user)
预加载
gorm 因为性能问题不会加载关联属性,可以通过 Preload 函数支持预加载
// 订单表
type Orders struct {
gorm.Model
// 外键
UserID uint
Price float64
}
// 用户表
type User struct {
gorm.Model
Username string
// 关联订单,一对多关联关系
Orders []Orders
}
// 预加载 Orders 字段值,Orders 字段是 User 的关联字段
db.Preload("Orders").Find(&users)
// 通过 Set 设置 gorm:auto_preload 属性,开启自动预加载,查询的时候才会自动完成关联查询
db.Set("gorm:auto_preload", true).Find(&users)