模型是标准的 struct,由 Go 的基本数据类型、实现了 Scanner
和 Valuer
接口的自定义类型及其指针或别名组成
定义一张表
type Student struct {
ID uint // 默认使用ID作为主键
Name string
Email *string // 使用指针是为了存空值
}
常识:小写属性是不会生成字段的
自动生成表结构
// 可以放多个
DB.AutoMigrate(&Student{})
AutoMigrate
的逻辑是只新增,不删除,不修改(大小会修改)
例如将Name修改为Name1,进行迁移,会多出一个name1的字段
生成的表结构如下
CREATE TABLE `f_students` (`id` bigint unsigned AUTO_INCREMENT,`name` longtext,`email` longtext,PRIMARY KEY (`id`))
默认的类型太大了
修改大小
我们可以使用gorm的标签进行修改
有两种方式
Name string `gorm:"type:varchar(12)"`
Name string `gorm:"size:2"`
字段标签
type
定义字段类型
size
定义字段大小
column
自定义列名
primaryKey
将列定义为主键
unique
将列定义为唯一键
default
定义列的默认值
not null
不可为空
embedded
嵌套字段
embeddedPrefix
嵌套字段前缀
comment
注释
多个标签之前用 ;
连接
type StudentInfo struct {
Email *string `gorm:"size:32"` // 使用指针是为了存空值
Addr string `gorm:"column:y_addr;size:16"`
Gender bool `gorm:"default:true"`
}
type Student struct {
Name string `gorm:"type:varchar(12);not null;comment:用户名"`
UUID string `gorm:"primaryKey;unique;comment:主键"`
Info StudentInfo `gorm:"embedded;embeddedPrefix:s_"`
}
// 建表语句
CREATE TABLE `students` (
`name` varchar(12) NOT NULL COMMENT '用户名',
`uuid` varchar(191) UNIQUE COMMENT '主键',
`s_email` varchar(32),
`s_y_addr` varchar(16),
`s_gender` boolean DEFAULT true,
PRIMARY KEY (`uuid`)
)