后端基础班Day3-初识Gorm | 青训营笔记

63 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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.连接数据库、增删改查数据-简:

  1. 连接数据库:
db, err := gorm.Open(
    mysql.Open(DSN语句), &grom.Config{}
    )
if err != nil {
    panic(err)
}
  1. 增删改查数据
// 增
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浪一下。