这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
本篇笔记主要记录一下Gorm的学习知识
Gorm是一个迭代了10年+的功能强大的ORM框架(Object Relational Mapping),也就是用元数据将对象和关系映射细节描述。
1. Gorm的默认约定有:
- Gorm使用名为ID的字段作为主键
- 使用结构体的蛇形复数作为表名,比如结构体为UserInfo,那么表名将会是user_infos
- 字段名的蛇形作为列名,比如字段名为UserId,那么列名将会是user_id
- 使用CreateAt、UpdateAt字段作为创建、更新时间,也提供了DeleteAt字段作为软删除时间
- 支持tag标签,可以在结构体后面打gorm标签,来规定字段名映射的列名或者默认值等等约束
如果对表名规则约定不熟悉的话,可以实现结构体方法TableName() 对表名进行约束
2.连接数据库、增删改查数据-简:
- 连接数据库:
db, err := gorm.Open(
mysql.Open(DSN语句), &grom.Config{}
)
if err != nil {
panic(err)
}
- 增删改查数据
// 增
db.Create(&product)
db.Clauses(clause.OnConflict(DoNothing: true}).Create(&product) // 不处理冲突创建数据
// 查
db.First(&product, key) // 根据整型主键key查找
db.First(&product, "code = ?", "D42") // 查找code字段值为D42的记录
/* First如果查空会报错,所以还是建议使用Fine方法进行查找 */
// 改
db.Model(&product).Update("Price", 200) // 将product的price更新为200
db.Model(&product).Updates(Product{.....更新字段.....}) // 仅更新非零值字段
db.Model(&product).Updates(map[string]interface{}{"Key": value, ....}) // map形式
// 删
db.Delete(&product, key)
值得注意的是,因为gorm每次返回的都是数据库对象,因此它是一个链式结构。这也就意味着在调用操作的时候需要注意顺序,比如如果在执行操作之后才加上了Where语句,那么这个是无效的,因为操作已经提前执行了,而并不会连接上Where后的具体的条件语句。
3.事务与Hook
Gorm提供了Begin、Commit、Rollback方法来使用事务。
Hook则是在增删改查之前、之后自动调用的函数,类似于触发器,但是任何Hook返回错误,Gorm将停止后续操作并回滚事务
当然具体的调用还是需要实践才可以知道的,在之前被这个蛇形复数折磨过,还是需要注意一下Gorm的规则的。
人生苦短,不如go浪一下。