ORM 框架 | 青训营笔记

101 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

GORM

安装

//  gorm安装
go get -u gorm.io/gorm
// 驱动安装
go get -u gorm.io/driver/sqlite

GORM通过驱动连接数据库

mysqlConfig := mysql.Config{
   DSN:                       DSN, // DSN信息
   DefaultStringSize:         256,     // string最大长度
   SkipInitializeWithVersion: false,   // 自动配置MySQL版本
}
db, err := gorm.Open(mysql.New(mysqlConfig), &gorm.Config{})

DSN表示数据源名称,是一种数据结构,包含有关打开数据库连接驱动程序连接到数据库所需的特定数据库的信息

GORM对增删改查的支持

可以在自定义的模型/结构体中,增加 gorm.Model 会为表新增以下四个字段。

// gorm.Model结构体 
type Model struct { 
    ID uint `gorm:"primary_key"` 
    CreatedAt time.Time 
    UpdatedAt time.Time 
    DeletedAt *time.Time `sql:"index"` 
}

GORM 中基本的函数使用

type UserInfo struct {
   gorm.Model
   Username string `json:"username" gorm:"primary_key"` // 根据 username确定
   Name     string `json:"name"`                        // 默认设置为username
}

// 定义表名
func (UserInfo) TableName() string {
   return "user_infos"
}

var userInfo = &UserInfo{Username:"admin",Name:"admin"}
// Create 创建 - insert into users(username,name) values("admin","admin")
db.Create(userInfo)

// Find 查找 - select * from user where name = "admin"
db.Where("name = ?","admin").Find(&user)

// Find 结构体查找 -  - select * from user where name = "admin"
db.Where( &UserInfo{Username:"admin",Name:"admin"}).Find(&user)

// First 创建 - 需要注意使用 First 时,First检测不到数据会返回 error
db.Where("name = ?","admin").Find(&user)

// Update 更新 - 使用结构体更新数据时,会忽略为 0 的数据
// update users set username = "hello" where username = "admin"
db.Model(userInfo).Where("username = ?", admin).Update("username","hello")

// Delete 删除 - 当被删除的结构体中包含 gorm.DeletAt 时,删除为软删除,Delete字段的值设置为当前时间
// 使用 Unscoped 可以查询到被软删的数据
// delete from * where username = "admin"
db.Where("username = ?", admin).Delete()

GORM 对事务的支持

提供了 Begin、Commit、Rollback 方法用于事务的处理

在 Transaction 中会自动提交事务,避免开发时漏写 Commit、Rollback

对于写操作,GORM将默认封装在事务内运行,为了提高性能忽视数据完整性可以开启 SkipDafaultTransaction