简单的模型定义

  1. type User struct {
  2. ID uint
  3. Name string
  4. Email *string
  5. Age uint8
  6. Birthday *time.Time
  7. MemberNumber sql.NullString
  8. ActivedAt sql.NullTime
  9. CreatedAt time.Time
  10. UpdatedAt time.Time
  11. }

表名的约定

和绝大数的ORM一样,从模型到真实db表到映射,都遵循一定的原则。 默认情况下, GORM使用ID作为主键,使用结构体名的蛇形复数作为表名。字段名的蛇形作为列名,并使用CreateAt, UpdatedAt字段追踪创建,更新时间。

针对表名,我们来举两个简答的例子:

  1. 结构体名 表名
  2. Order orders
  3. TaxAgency tax_agencies
  4. Batch batchs
  5. LineItem line_items

如果命名不符合我们的需求,还可以实现自定义的表名

  1. type Tabler interface {
  2. TableName() string
  3. }
  4. // TableName 会将 User 的表名重写为 `profiles`
  5. func (User) TableName() string {
  6. return "profiles"
  7. }

字段标签

声明model时,tag是可选的,GORM支持以下tag:tag名大小写不敏感,但是建议使用驼峰式命名风格。下面展示的是常见一个常见标签声明,后面的创建的时候,可以以这个结构体声明为样本:

  1. type Deployment struct {
  2. Model
  3. TId string `gorm:"size:36;not null;default:'';column:tid;index"`
  4. DeploymentId string `gorm:"size:36;not null;default:'';index"`
  5. Name string `gorm:"size:36;not null;default:''"`
  6. Status int `gorm:"not null;default 0"` // 0未开始 1进行中 2成功 3失败
  7. Reason string `gorm:"size:256;not null;default:''"`
  8. Step int `gorm:"not null;default 0"` // step 有可能是-1,-2,-3, 所以为int
  9. RemainingRetry int `gorm:"not null;default 0"`
  10. SnList string `gorm:"size:1024;not null;default:''"` // json string, e.g. ["sn1","sn2","sn3"...]
  11. Extra string `gorm:"size:1024;not null;default:''"`
  12. }

注意到这个标签里面:

  • colunm: 指定db列名
  • not null: 指定列为NOT NULL
  • index: 创建索引
  • default: 指定列的默认值
  • uniqueIndex: 与index相同,但创建的是唯一索引

参考:
模型定义
rails on ruby,ruby on rails 之 Active Record