gorm 模型定义 | 青训营笔记

61 阅读2分钟

gorm

gorm是Golang语言中一款性能极好的ORM库,对开发人员相对是比较友好的。接下来主要学习下gorm库的一些基本使用。

功能概览

  • 全功能 ORM
  • 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
  • Create,Save,Update,Delete,Find 中钩子方法
  • 支持 Preload、Joins 的预加载
  • 事务,嵌套事务,Save Point,Rollback To Saved Point
  • Context、预编译模式、DryRun 模式
  • 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
  • SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询 复合主键,索引,约束
  • Auto Migration
  • 自定义 Logger
  • 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
  • 每个特性都经过了测试的重重考验
  • 开发者友好

模型定义

基本定义

因为orm可以自动创建数据库,创建表,所以我们要用一个约定的形式来描述一个schema,便于他创建表,也便于代码中调用

例如

type User struct {
  Name         string
  Email        string
  Age          uint8
}

这样的一个结构体就可以描述user这个表

gorm.Model

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

这个约定了一些gorm的标准配置,相当于implement了这个结构体

例如

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

这样这个gorm.Model相当于在user表里添加了一些基础的字段

这个user最终会变成 相当于

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 来为 db 中的字段名添加前缀 Author Author `gorm:"embedded;embeddedPrefix:author_"

总结

gorm是个很好用的go的orm框架,对很多数据库都兼容