gorm
gorm是Golang语言中一款性能极好的ORM库,对开发人员相对是比较友好的。接下来主要学习下gorm库的一些基本使用。
功能概览
- 全功能 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…
- 每个特性都经过了测试的重重考验
- 开发者友好
模型定义
基本定义
因为orm可以自动创建数据库,创建表,所以我们要用一个约定的形式来描述一个schema,便于他创建表,也便于代码中调用
例如
type User struct {
Name string
Email string
Age uint8
}
这样的一个结构体就可以描述user这个表
gorm.Model
// gorm.Model 的定义
type Model struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
这个约定了一些gorm的标准配置,相当于implement了这个结构体
例如
go
type User struct {
gorm.Model
Name string
Email string
Age uint8
}
这样这个gorm.Model相当于在user表里添加了一些基础的字段
这个user最终会变成 相当于
type User struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
Name string
Email string
Age uint8
}
嵌入结构体
如上的gorm.Model就是一种嵌入结构体
官网的解释是:对于匿名字段,GORM 会将其字段包含在父结构体中
其他嵌入方法为:
对于正常的结构体字段,你也可以通过标签 embedded 将其嵌入,例如:
type Author struct {
Name string
Email string
}
type Blog struct {
ID int
Author Author `gorm:"embedded"`
Upvotes int32
}
// 它等效于
type Blog struct {
ID int64
Name string
Email string
Upvotes int32
}
可以使用标签 embeddedPrefix 来为 db 中的字段名添加前缀 Author Author `gorm:"embedded;embeddedPrefix:author_"
总结
gorm是个很好用的go的orm框架,对很多数据库都兼容