模型定义 模型是标准的 struct,由 Go 的基本数据类型、实现了 Scanner 和 Valuer 接口的自定义类型及其指针或别名组成 简单来说就是我们日常开发中定义的结构体
type User struct { ID uint Name string Email *string Age uint8 Birthday *time.Time MemberNumber sql.NullString ActivatedAt sql.NullTime CreatedAt time.Time UpdatedAt time.Time } gorm.Model gorm倾向于约定大于配置,默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间
针对上述约定,GORM 定义一个 gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt
// gorm.Model 的定义
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
}
// 等效于
type User struct {
ID uint gorm:"primaryKey"
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt gorm:"index"
Name string
}
这样做有什么好处?
Create和Update的时候自动填充创建时间和更新时间,在创建的时候自动检测主键冲突,如果冲突则更新
在查询的时候自动保证数据不是被逻辑删除的
// Create db.Create(&Product{Code: "D42", Price: 100}) // Read var product Product db.Debug().First(&product, 1) // 根据整形主键查找 对应的SQL
当需要逻辑删除的时候,不需要额外编写update语句去更新,直接使用gorm中封装的Delete即可。
// Delete - 删除 product db.Debug().Delete(&product)