简单的模型定义
type User struct {
ID uint
Name string
Email *string
Age uint8
Birthday *time.Time
MemberNumber sql.NullString
ActivedAt sql.NullTime
CreatedAt time.Time
UpdatedAt time.Time
}
表名的约定
和绝大数的ORM一样,从模型到真实db表到映射,都遵循一定的原则。 默认情况下, GORM使用ID作为主键,使用结构体名的蛇形复数作为表名。字段名的蛇形作为列名,并使用CreateAt, UpdatedAt字段追踪创建,更新时间。
针对表名,我们来举两个简答的例子:
结构体名 表名
Order orders
TaxAgency tax_agencies
Batch batchs
LineItem line_items
如果命名不符合我们的需求,还可以实现自定义的表名
type Tabler interface {
TableName() string
}
// TableName 会将 User 的表名重写为 `profiles`
func (User) TableName() string {
return "profiles"
}
字段标签
声明model时,tag是可选的,GORM支持以下tag:tag名大小写不敏感,但是建议使用驼峰式命名风格。下面展示的是常见一个常见标签声明,后面的创建的时候,可以以这个结构体声明为样本:
type Deployment struct {
Model
TId string `gorm:"size:36;not null;default:'';column:tid;index"`
DeploymentId string `gorm:"size:36;not null;default:'';index"`
Name string `gorm:"size:36;not null;default:''"`
Status int `gorm:"not null;default 0"` // 0未开始 1进行中 2成功 3失败
Reason string `gorm:"size:256;not null;default:''"`
Step int `gorm:"not null;default 0"` // step 有可能是-1,-2,-3, 所以为int
RemainingRetry int `gorm:"not null;default 0"`
SnList string `gorm:"size:1024;not null;default:''"` // json string, e.g. ["sn1","sn2","sn3"...]
Extra string `gorm:"size:1024;not null;default:''"`
}
注意到这个标签里面:
- colunm: 指定db列名
- not null: 指定列为NOT NULL
- index: 创建索引
- default: 指定列的默认值
- uniqueIndex: 与index相同,但创建的是唯一索引