GORM学习笔记
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…
- 每个特性都经过了测试的重重考验
- 开发者友好
模型
模型是标准的struct
例如:
go
1 | type User struct { |
权限控制
设置字段的权限位只读、只写、只创建、只更新或者被忽略
go
1 | type User struct { |
字段标签
标签名 | 说明 |
---|---|
column | 指定 db 列名 |
type | 列数据类型,推荐使用兼容性好的通用类型,例如:所有数据库都支持 bool、int、uint、float、string、time、bytes 并且可以和其他标签一起使用,例如:not null 、size , autoIncrement … 像 varbinary(8) 这样指定数据库数据类型也是支持的。在使用指定数据库数据类型时,它需要是完整的数据库数据类型,如:MEDIUMINT UNSIGNED not NULL AUTO_INCREMENT |
serializer | 指定将数据序列化或反序列化到数据库中的序列化器, 例如: serializer:json/gob/unixtime |
size | 定义列数据类型的大小或长度,例如 size: 256 |
primaryKey | 将列定义为主键 |
unique | 将列定义为唯一键 |
default | 定义列的默认值 |
precision | 指定列的精度 |
scale | 指定列大小 |
not null | 指定列为 NOT NULL |
autoIncrement | 指定列为自动增长 |
autoIncrementIncrement | 自动步长,控制连续记录之间的间隔 |
embedded | 嵌套字段 |
embeddedPrefix | 嵌入字段的列名前缀 |
autoCreateTime | 创建时追踪当前时间,对于 int 字段,它会追踪时间戳秒数,您可以使用 nano /milli 来追踪纳秒、毫秒时间戳,例如:autoCreateTime:nano |
autoUpdateTime | 创建/更新时追踪当前时间,对于 int 字段,它会追踪时间戳秒数,您可以使用 nano /milli 来追踪纳秒、毫秒时间戳,例如:autoUpdateTime:milli |
index | 根据参数创建索引,多个字段使用相同的名称则创建复合索引,查看 索引 获取详情 |
uniqueIndex | 与 index 相同,但创建的是唯一索引 |
check | 创建检查约束,例如 check:age > 13 ,查看 约束 获取详情 |
<- | 设置字段写入的权限, <-:create 只创建、<-:update 只更新、<-:false 无写入权限、<- 创建和更新权限 |
-> | 设置字段读的权限,->:false 无读权限 |
- | 忽略该字段,- 表示无读写,-:migration 表示无迁移权限,-:all 表示无读写迁移权限 |
comment | 迁移时为字段添加注释 |
连接到数据库
GORM官方支持的数据库类型有:MySQL, PostgreSQL, SQLite, SQL Server 和 TiDB
连接到MySQL
go
1 | import ( |
MySQL驱动程序提供了一些高级配置可以在初始化时使用,例如:
go
1 | db, err := gorm.Open(mysql.New(mysql.Config{ |
CRUD
创建
创建一条记录
go
1 | user := User{Name:"Jinzhu", Age: 18, Birthday: time.Now()} |
用所选字段创建记录
go
1 | db.Select("Name", "Age", "CreatedAt").Create(&user) |
创建一条记录,忽略未指出的字段。
批量插入
go
1 | var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}} |
创建Hooks
GORM提供的hooks有BeforeSave
, BeforeCreate
,AfterSave
,AfterCreate
.
go
1 | func (u *User) BeforeCreate(tx *gorm.DB) (err error) { |
查询
查询单个对象
GORM提供了First
, Take
, Last
方法从数据库中检索对象
go
1 | // 查询主键值第一的记录 |
根据主键查询
go
1 | db.First(&user, 10) |
条件查询
字符串条件
go
1 | // 获取匹配的记录 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Napleon!
评论
Powered By Valine
v1.5.2
v1.5.2