这是我参与「第五届青训营 」伴学笔记创作活动的第 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