GORM|青训营

104 阅读2分钟

Gorm: Golang中的高性能ORM库

Gorm是Go编程语言中的一个高效ORM库,它对开发者非常友好。接下来,我们将探讨Gorm库的基本用法。

功能一览

  • 全功能ORM。
  • 支持各种关联方式,如Has One、Has Many、Belongs To、Many To Many、多态和单表继承。
  • 在Create、Save、Update、Delete、Find中有钩子方法。
  • 支持Preload和Joins的预加载。
  • 提供事务管理,如事务、嵌套事务、保存点、回滚至保存点。
  • 其他功能如Context、预编译模式、DryRun模式、批量插入、FindInBatches、使用SQL表达式和Context Valuer进行CRUD等。
  • 强大的SQL构建器,支持Upsert、数据库锁、Optimizer/Index/Comment Hint、命名参数、子查询等。
  • 自动数据库迁移功能。
  • 自定义的日志记录器。
  • 灵活的插件API,如支持多数据库、读写分离的Database Resolver、Prometheus等。
  • 每项功能都经过严格的测试。
  • 开发者友好性

模型定义

基本定义: 由于ORM可以自动创建数据库和表,所以我们需要使用一种约定的方式来描述schema。例如:

type User struct {
  Name   string
  Email  string
  Age    uint8
}

这种结构体可以描述user这个表。 gorm.Model: 它定义了Gorm的标准配置。

type Model struct {
  ID        uint           `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt gorm.DeletedAt `gorm:"index"`
}

这样,当你在一个结构体中嵌入gorm.Model时,它将为你的表添加一些基础字段。例如:

type User struct {
  gorm.Model
  Name   string
  Email  string
  Age    uint8
}

这种表示方式实际上等价于:

type User struct {
  ID        uint           `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt gorm.DeletedAt `gorm:"index"`
  Name      string
  Email     string
  Age       uint8
}

嵌入结构体: gorm.Model就是一种嵌入结构体的例子。对于匿名字段,GORM会自动将其字段加入到父结构体中。你还可以使用embedded标签将一个普通的结构体字段嵌入另一个结构体。例如:

type Author struct {
    Name  string
    Email string
}

type Blog struct {
  ID      int
  Author  Author `gorm:"embedded"`
  Upvotes int32
}

这等效于:

type Blog struct {
  ID      int64
  Name    string
  Email   string
  Upvotes int32
}

还可以使用embeddedPrefix标签为数据库中的字段名添加前缀。

总结

Gorm是一个强大且易用的Go ORM框架,支持多种数据库。