这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
1.梗概
GORM框架主要用于数据库操作,操作简单,使用方便,使开发者在写代码的过程中不需要手写sql代码
2,特点
- 全功能 ORM
- 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
- Create,Save,Update,Delete,Find 中钩子方法
- 支持 Preload、Joins 的预加载
- 事务,嵌套事务,Save Point,Rollback To Saved Point
- Context、预编译模式、DryRun 模式
- 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
- SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
- 复合主键,索引,约束
- Auto Migration
- 自定义 Logger
- 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
- 每个特性都经过了测试的重重考验
- 开发者友好
3.使用
go语言使用GORM框架时必须安装gorm库并连接数据库驱动,GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
使用gorm的open方法可以打开数据库链接,并且进行相关数据库链接属性配置,如DSN表示通过使用tcp协议连接地址127.0.0.1,端口号为3306,DefaultStringSize表示string 类型字段的默认长度等。然后用err接收打开是否成功的结果。
db, err := gorm.Open(mysql.New(mysql.Config{
DSN:"root:768213@tcp(127.0.0.1:3306)/gormcharset=utf8&parseTime=True&loc=Local",
DefaultStringSize:256,
DisableDatetimePrecision:true,
DontSupportRenameIndex:true,
DontSupportRenameColumn:true,
SkipInitializeWithVersion:false,
}), &gorm.Config{})
if err != nil {
panic("打开数据库链接失败")
}
sqlDB, err := db.DB()
//空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(10)
//打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(100)
//连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(time.Hour)
fmt.Println("连接成功")
select {}
GORM 倾向于约定,而不是配置,这是一个默认规则。正常情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间。
如下图代码gorm.model的默认定义,如果有另外的需求,还可以自行添加字段,如注释中的内容,添加了Name与Age两个自定义字段并且规定了默认值。
type Model struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
//Name string `gorm:"default:Tony"`
//Age int64 `gorm:"default:20"`
}
对于增删查改等操作,为了保证数据完整性,gorm会把他们封装在事务内进行,可以在数据库链接配置中添加SkipDefaultTransaction:true语句关闭默认事务提高性能,并且还有PrepareStmt:true语句缓存预编译语句提高后续调用速度。