模型定义
模型是标准的 struct,由 Go 的基本数据类型、实现了 Scanner 和 Valuer 接口的自定义类型及其指针或别名组成。如:
type User struct {
ID uint
Name string
Email *string //使用指针是为了传空值
Age uint8
Birthday *time.Time
MemberNumber sql.NullString
ActivatedAt sql.NullTime
CreatedAt time.Time
UpdatedAt time.Time
}
若字段名小写,则无法跨包访问,无法生成相关表的相关字段
自动生成表结构 (自动迁移)
AutoMigrate
的逻辑是只新增,不删除,不修改(大小会修改)
type Student struct {
ID uint
Name string
Age int
Email *string
}
创建所用的sql语句
CREATE TABLE `students` (`id` bigint unsigned AUTO_INCREMENT,`name` longtext,`age` bigint,`email` longtext,PRIMARY KEY (`id`))
问题是默认的类型太大
字段标签
声明 model 时,tag 是可选的,GORM 支持以下 tag: tag 名大小写不敏感,但建议使用 camelCase
风格
标签名 | 说明 |
---|---|
column | 指定 db 列名 |
type | 列数据类型,推荐使用兼容性好的通用类型,例如:所有数据库都支持 bool、int、uint、float、string、time、bytes 并且可以和其他标签一起使用,例如:not null 、size , autoIncrement … 像 varbinary(8) 这样指定数据库数据类型也是支持的。在使用指定数据库数据类型时,它需要是完整的数据库数据类型,如:MEDIUMINT UNSIGNED not NULL AUTO_INCREMENT |
serializer | 指定将数据序列化或反序列化到数据库中的序列化器, 例如: serializer:json/gob/unixtime |
size | 定义列数据类型的大小或长度,例如 size: 256 |
primaryKey | 将列定义为主键 |
unique | 将列定义为唯一键 |
default | 定义列的默认值 |
precision | 指定列的精度 |
scale | 指定列大小 |
not null | 指定列为 NOT NULL |
autoIncrement | 指定列为自动增长 |
autoIncrementIncrement | 自动步长,控制连续记录之间的间隔 |
embedded | 嵌套字段 |
embeddedPrefix | 嵌入字段的列名前缀 |
autoCreateTime | 创建时追踪当前时间,对于 int 字段,它会追踪时间戳秒数,您可以使用 nano /milli 来追踪纳秒、毫秒时间戳,例如:autoCreateTime:nano |
autoUpdateTime | 创建/更新时追踪当前时间,对于 int 字段,它会追踪时间戳秒数,您可以使用 nano /milli 来追踪纳秒、毫秒时间戳,例如:autoUpdateTime:milli |
index | 根据参数创建索引,多个字段使用相同的名称则创建复合索引,查看 索引 获取详情 |
uniqueIndex | 与 index 相同,但创建的是唯一索引 |
check | 创建检查约束,例如 check:age > 13 ,查看 约束 获取详情 |
<- | 设置字段写入的权限, <-:create 只创建、<-:update 只更新、<-:false 无写入权限、<- 创建和更新权限 |
-> | 设置字段读的权限,->:false 无读权限 |
- | 忽略该字段,- 表示无读写,-:migration 表示无迁移权限,-:all 表示无读写迁移权限 |
comment | 迁移时为字段添加注释 |
标签之间用;隔开
修改大小
我们可以使用gorm的标签进行修改
有两种方式
Name string `gorm:"type:varchar(12)"`
Name string `gorm:"size:2"`
例如以下结构体
type Student struct {
ID uint `gorm:"size:10"`
Name string `gorm:"size:16"`
Age int `gorm:"size:3"`
Email *string `gorm:"size:128"`
}
建立表的sql语句
[23.337ms] [rows:0] ALTER TABLE `students` MODIFY COLUMN `name` varchar(16)
2023/11/22 18:16:44 E:/backend/go/study/learn/gorm/learn/testgorm.go:43
[20.146ms] [rows:0] ALTER TABLE `students` MODIFY COLUMN `age` tinyint
2023/11/22 18:16:44 E:/backend/go/study/learn/gorm/learn/testgorm.go:43
[18.601ms] [rows:0] ALTER TABLE `students` MODIFY COLUMN `email` varchar(128)
可以看到 表内容类型 改变