Go语言框架学习(一) | 青训营笔记

59 阅读2分钟

这是我参与「第五届青训营」笔记创作活动的第6天。

学习内容

今天学习了Go的ORM框架——GORM

Gorm

迭代了10年+的功能强大的ORM框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展。
ORM(Object Relational Mapping)框架采用元数据来描述对象与关系映射的细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。简单理解为一种框架的格式。

Gorm的使用

  1. 定义一个gorm model,可以是一个结构体
type Product struct{
    Code string
    Price uint
}
  1. 为model定义表名
func (p Product) TableName() string{
    return "product"
}
  1. 连接数据库
db, err := gorm.Open(mysql.Open("user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{})
  1. 创建数据
db.Create(&Product{Code: "xxx", Price: xxx}) //创建多条可以使用list

链式调用,可以获取返回值,返回值的Error字段反映创建是否成功。
处理数据冲突使用clause.OnConflict,使用default标签为字段定义默认值。
5. 查询

var product Product
db.First(&product, 1) //根据整型主键查找
db.First(&product, "code = ?", "xxx") //其他条件查找
db.Where("condition", "value",...).Find(&product) //查询多条

使用First时,查询不到时返回一个ErrRecordNotFound,而使用Find时查不到数据不会返回错误。
6. 更新

db.Model(&product).Update("Price", xxx)
db.Model(&product).Updates(Product{Price: xxx, Code: "xxx"}) //多字段非零值
db.Model(&product).Updates(map[string]interface{}{"Price": xxx, "Code": "xxx"})
db.Model(xxx).select(xxx).Update(xxx) //使用select更新选定字段
db.Model(&product).Update("price", gorm.Expr("price * ? + ?", 2, 100) //表达式更新
  1. 删除
db.Delete(&product, 1) //主键删除
db.Delete(Product{}, "condition", "value")
db.Where(xxx).Delete(Product{})

软删除:在结构体中定义一个字段Deleted gorm.DeleteAt,这样记录不会从数据库中真正删除,使用Unscoped可以查询到被软删除的数据。
8. 事务 Gorm提供了Begin\Commit和Rollback方法用于事务使用

tx := db.Begin()
tx.Rollback()
tx.Commit()

Gorm提供了Tansaction方法用于自动提交事务,避免用户漏写Commit和Rollback

Gorm的约定

  • 使用ID字段作为主键
  • 使用结构体蛇形负数作为表名
  • 字段名的蛇形作为列名
  • 使用CreatedAt、UpdatedAt字段创建、更新时间

连接数据库

Gorm通过驱动连接数据库,目前支持MySQL、SQLserver、PostgreSQL和SQLite

Gorm的Hook

Gorm提供了CURD的Hook能力。
Hook是在创建、查询、更新、删除等操作之前、之后自动调用的函数。
如果任何Hook返回错误,Gorm将停止后续操作并回滚事务。

Gorm性能提高

对于 写操作,为确保数据的完整性,gorm会默认将他们封装在事务内运行。但这会降低性能,可以使用SkipDefaultTransaction关闭默认事务。
使用PrepareStmt缓存预编译语句可以提高后续调用的速度。

db, err := gorm.Open(mysql.Open("user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{
    SkipDefaultTransaction: true,
    PrepareStmt: true,
})

Gorm生态

gorm.cn/ 捕获.PNG