golang的gorm操作指南
背景
首次尝试使用golang下的orm
类库 gorm
, 做一下记录
分析流程:
构成
基于原有的go-sql-driver/mysql golang的mysql驱动做的封装, 但是兼容多种数据库源, 比如postgresl, sqlite等常见操作。
调用方式
链式调用结构, 比如可以这样调用 db.select().find(), 和一般的orm操作方式基本一致。
与model映射
可以通过映射关系,数据库查询字段和golang的数据结构体的字段进行一一映射绑定, 方便转化为结构体。
比如
1 |
|
gorm内部有一些约定的规则, 来简化日常操作, 只需学习一次记住,即可。
基本模型定义gorm.Model
,包括字段ID
,CreatedAt
,UpdatedAt
,DeletedAt
,你可以将它嵌入你的模型,或者只写你想要的字段。
1 |
|
//在我们的数据库,添加字段 ID
, CreatedAt
, UpdatedAt
, DeletedAt
type User struct {
gorm.Model
Name string
}
// 如果我们的结构体,只需要字段 ID
, CreatedAt
type User struct {
ID uint
CreatedAt time.Time
Name string
}
表名复数
默认表名是结构体名称的复数形式
即我们写常用gorm语句时, 通过不会指定操作的表名, gorm会聪明的,认为我们操作的结构体的名称+s即是表名, 我认为是小聪明吧。刚开始入手时, 有些疑惑
1 |
|
我们可以修改全局的默认表名结构,比如统一给他们加前缀,或者后缀, 方式如下
1 |
|
列名映射
列名是字段名的蛇形小写.
更符合我们命名习惯, 即代码驼峰映射成 蛇形mysql数据字段,但是,新手依然会容易误导
1 |
|
字段ID为主键
1 |
|
我的角度,禁止代码直接修改表结构,容易逃过审计操作记录。
字段CreatedAt用于存储记录的创建时间, 默认操作, 建议慎用
1 |
|
字段UpdatedAt
用于存储记录的修改时间, 默认操作建议慎用
1 |
|
字段DeletedAt用于存储记录的删除时间,如果字段存在(不建议使用)
删除具有DeletedAt字段的记录,它不会冲数据库中删除,但只将字段DeletedAt设置为当前时间,并在查询时无法找到记录,
回调操作(Callbacks):
即将curd事务化, 并且在事务过程中,预先埋好钩子hook, 用户实现钩子hook, 比如做一些特殊检查, 失败,即回滚整个事务。
操作复杂, 不建议使用
总结:
优点:
- 功能强大, 对golang原有mysql-driver,做了非常强大的上层封装
缺点:
- 不够精简,稍显复杂
- 如果使用ORM操作,只能通过日志形式,获得原生sql语句, 无法进行埋点,进行调用链追踪。
实践代码如下:
1 |
|
参考链接
- https://jasperxu.github.io/gorm-zh/development.html
- http://gorm.io/docs/sql_builder.html