1. 惯例

1.1. gorm.Model

gorm.Model 是一个包含一些基本字段的结构体, 包含的字段有 IDCreatedAtUpdatedAtDeletedAt

你可以用它来嵌入到你的模型中,或者也可以用它来建立自己的模型。

  1. // gorm.Model 定义
  2. type Model struct {
  3. ID uint `gorm:"primary_key"`
  4. CreatedAt time.Time
  5. UpdatedAt time.Time
  6. DeletedAt *time.Time
  7. }
  8. // 将字段 `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt` 注入到 `User` 模型中
  9. type User struct {
  10. gorm.Model
  11. Name string
  12. }
  13. // 声明 gorm.Model 模型
  14. type User struct {
  15. ID int
  16. Name string
  17. }

1.2. ID 作为主键

GORM 默认使用 ID 作为主键名。

  1. type User struct {
  2. ID string // 字段名 `ID` 将被作为默认的主键名
  3. }
  4. // 设置字段 `AnimalID` 为默认主键
  5. type Animal struct {
  6. AnimalID int64 `gorm:"primary_key"`
  7. Name string
  8. Age int64
  9. }

1.3. 复数表名

表名是结构体名称的复数形式

  1. type User struct {} // 默认的表名是 `users`
  2. // 设置 `User` 的表名为 `profiles`
  3. func (User) TableName() string {
  4. return "profiles"
  5. }
  6. func (u User) TableName() string {
  7. if u.Role == "admin" {
  8. return "admin_users"
  9. } else {
  10. return "users"
  11. }
  12. }
  13. // 如果设置禁用表名复数形式属性为 true,`User` 的表名将是 `user`
  14. db.SingularTable(true)

1.3.1. 指定表名

  1. // 用 `User` 结构体创建 `delete_users` 表
  2. db.Table("deleted_users").CreateTable(&User{})
  3. var deleted_users []User
  4. db.Table("deleted_users").Find(&deleted_users)
  5. //// SELECT * FROM deleted_users;
  6. db.Table("deleted_users").Where("name = ?", "jinzhu").Delete()
  7. //// DELETE FROM deleted_users WHERE name = 'jinzhu';

1.3.2. 修改默认表名

你可以通过定义 DefaultTableNameHandler 字段来对表名使用任何规则。

  1. gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string {
  2. return "prefix_" + defaultTableName;
  3. }

1.4. 蛇形列名

列名是字段名的蛇形小写形式

  1. type User struct {
  2. ID uint // 字段名是 `id`
  3. Name string // 字段名是 `name`
  4. Birthday time.Time // 字段名是 `birthday`
  5. CreatedAt time.Time // 字段名是 `created_at`
  6. }
  7. // 重写列名
  8. type Animal struct {
  9. AnimalId int64 `gorm:"column:beast_id"` // 设置列名为 `beast_id`
  10. Birthday time.Time `gorm:"column:day_of_the_beast"` // 设置列名为 `day_of_the_beast`
  11. Age int64 `gorm:"column:age_of_the_beast"` // 设置列名为 `age_of_the_beast`
  12. }

1.5. 时间戳跟踪

1.5.1. CreatedAt

对于有 CreatedAt 字段的模型,它将被设置为首次创建记录的当前时间。

  1. db.Create(&user) // 将设置 `CreatedAt` 为当前时间
  2. // 你可以使用 `Update` 方法来更改默认时间
  3. db.Model(&user).Update("CreatedAt", time.Now())

1.5.2. UpdatedAt

对于有 UpdatedAt 字段的模型,它将被设置为记录更新时的当前时间。

  1. db.Save(&user) // 将设置 `UpdatedAt` 为当前时间
  2. db.Model(&user).Update("name", "jinzhu") // 将设置 `UpdatedAt` 为当前时间

1.5.3. DeletedAt

对于有 DeletedAt 字段的模型,当删除它们的实例时,它们并没有被从数据库中删除,只是将 DeletedAt 字段设置为当前时间。参考 Soft Delete