Go框架三件套之GORM | 青训营笔记

51 阅读2分钟

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

1.梗概

GORM框架主要用于数据库操作,操作简单,使用方便,使开发者在写代码的过程中不需要手写sql代码

2,特点

  1. 全功能 ORM
  2. 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
  3. Create,Save,Update,Delete,Find 中钩子方法
  4. 支持 Preload、Joins 的预加载
  5. 事务,嵌套事务,Save Point,Rollback To Saved Point
  6. Context、预编译模式、DryRun 模式
  7. 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
  8. SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
  9. 复合主键,索引,约束
  10. Auto Migration
  11. 自定义 Logger
  12. 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
  13. 每个特性都经过了测试的重重考验
  14. 开发者友好

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 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAtUpdatedAt 字段追踪创建、更新时间。

如下图代码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语句缓存预编译语句提高后续调用速度。

4.引用

Gorm—Go语言数据库框架

Gorm—Go语言框架详解