模型

模型定义 {#md}

  1. type User struct {
  2. gorm.Model
  3. Birthday time.Time
  4. Age int
  5. Name string `gorm:"size:255"` // string默认长度为255, 使用这种tag重设。
  6. Num int `gorm:"AUTO_INCREMENT"` // 自增
  7. CreditCard CreditCard // One-To-One (拥有一个 - CreditCard表的UserID作外键)
  8. Emails []Email // One-To-Many (拥有多个 - Email表的UserID作外键)
  9. BillingAddress Address // One-To-One (属于 - 本表的BillingAddressID作外键)
  10. BillingAddressID sql.NullInt64
  11. ShippingAddress Address // One-To-One (属于 - 本表的ShippingAddressID作外键)
  12. ShippingAddressID int
  13. IgnoreMe int `gorm:"-"` // 忽略这个字段
  14. Languages []Language `gorm:"many2many:user_languages;"` // Many-To-Many , 'user_languages'是连接表
  15. }
  16. type Email struct {
  17. ID int
  18. UserID int `gorm:"index"` // 外键 (属于), tag `index`是为该列创建索引
  19. Email string `gorm:"type:varchar(100);unique_index"` // `type`设置sql类型, `unique_index` 为该列设置唯一索引
  20. Subscribed bool
  21. }
  22. type Address struct {
  23. ID int
  24. Address1 string `gorm:"not null;unique"` // 设置字段为非空并唯一
  25. Address2 string `gorm:"type:varchar(100);unique"`
  26. Post sql.NullString `gorm:"not null"`
  27. }
  28. type Language struct {
  29. ID int
  30. Name string `gorm:"index:idx_name_code"` // 创建索引并命名,如果找到其他相同名称的索引则创建组合索引
  31. Code string `gorm:"index:idx_name_code"` // `unique_index` also works
  32. }
  33. type CreditCard struct {
  34. gorm.Model
  35. UserID uint
  36. Number string
  37. }

约定 {#c}

gorm.Model 结构体

基本模型定义gorm.Model,包括字段IDCreatedAtUpdatedAtDeletedAt,你可以将它嵌入你的模型,或者只写你想要的字段

  1. // 基本模型的定义
  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`
  9. type User struct {
  10. gorm.Model
  11. Name string
  12. }
  13. // 只需要字段 `ID`, `CreatedAt`
  14. type User struct {
  15. ID uint
  16. CreatedAt time.Time
  17. Name string
  18. }

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

  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. // 全局禁用表名复数
  14. db.SingularTable(true) // 如果设置为true,`User`的默认表名为`user`,使用`TableName`设置的表名不受影响

更改默认表名

您可以通过定义DefaultTableNameHandler对默认表名应用任何规则。

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

列名是字段名的蛇形小写

  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. }

字段ID为主键

  1. type User struct {
  2. ID uint // 字段`ID`为默认主键
  3. Name string
  4. }
  5. // 使用tag`primary_key`用来设置主键
  6. type Animal struct {
  7. AnimalId int64 `gorm:"primary_key"` // 设置AnimalId为主键
  8. Name string
  9. Age int64
  10. }

字段CreatedAt用于存储记录的创建时间

创建具有CreatedAt字段的记录将被设置为当前时间

  1. db.Create(&user) // 将会设置`CreatedAt`为当前时间
  2. // 要更改它的值, 你需要使用`Update`
  3. db.Model(&user).Update("CreatedAt", time.Now())

字段UpdatedAt用于存储记录的修改时间

保存具有UpdatedAt字段的记录将被设置为当前时间

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

字段DeletedAt用于存储记录的删除时间,如果字段存在

删除具有DeletedAt字段的记录,它不会冲数据库中删除,但只将字段DeletedAt设置为当前时间,并在查询时无法找到记录,请参阅软删除