简单的模型定义
type User struct {ID uintName stringEmail *stringAge uint8Birthday *time.TimeMemberNumber sql.NullStringActivedAt sql.NullTimeCreatedAt time.TimeUpdatedAt time.Time}
表名的约定
和绝大数的ORM一样,从模型到真实db表到映射,都遵循一定的原则。 默认情况下, GORM使用ID作为主键,使用结构体名的蛇形复数作为表名。字段名的蛇形作为列名,并使用CreateAt, UpdatedAt字段追踪创建,更新时间。
针对表名,我们来举两个简答的例子:
结构体名 表名Order ordersTaxAgency tax_agenciesBatch batchsLineItem line_items
如果命名不符合我们的需求,还可以实现自定义的表名
type Tabler interface {TableName() string}// TableName 会将 User 的表名重写为 `profiles`func (User) TableName() string {return "profiles"}
字段标签
声明model时,tag是可选的,GORM支持以下tag:tag名大小写不敏感,但是建议使用驼峰式命名风格。下面展示的是常见一个常见标签声明,后面的创建的时候,可以以这个结构体声明为样本:
type Deployment struct {ModelTId 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, 所以为intRemainingRetry 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相同,但创建的是唯一索引
