- 博主简介:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。
- 博主主页: @是瑶瑶子啦
- 所属专栏: GORM框架学习
- 近期目标:写好专栏的每一篇文章
目录
- 一、GORM Model定义
- 1.1:快速入门
- 1.2:根据模型,自动生成表结构
- 1.3:内置的gorm.Model
- 1.3.1:时间戳跟踪
- 1.4:字段标签
一、GORM Model定义
在使用ORM工具时,需要在代码中定义模型(Model)将其和数据库中的数据表(table)进行映射。
在GORM中,模型可以是以下几种
- 结构体
- 基本go类型
- go类型变量指针
- 实现
sql.Scanner
或者driver.Valuer
的接口(interface)
1.1:快速入门
举例:
//定义一张表
type Student struct {
ID unint //默认使用ID为主键
Name string
Email *string //使用指针是为了存空指
💡 注意!!!
- 小写字母开头的属性不会生成字段,即不会映射到数据库的表中
因为在Go中,字段名首字母大写,代表这个字段是导出的(Exported),即对外可见;如果字段名首字母小写,代表这个字段是未导出的(Unexported),即对外不可见,外面不能访问和修改它,那就没有必要映射到数据库字段了。因此GORM会默认忽视它
- 默认使用ID为主键——primary_key(大小写不敏感!)
主键是用于标识一条记录的字段,每个记录在该字段上必须有唯一的值。在GORM中,如果没有指定主键,默认使用
ID
(大小写不敏感)作为主键
1.2:根据模型,自动生成表结构
我们在只是在Go代码上,单纯定义了个结构体,只能说是纸上谈兵。就像是你要建个房子,但是现在只是拥有个设计图纸。
那怎么把定义的模型,映射到数据库,生成表结构,真正建起房子呢?
需要使用GORM
框架中的AutoMigrate()
函数“自动迁移”,将“纸上”的东西,迁移到“实物”。
再通俗点来说,就是根据代码上创建好的这个图纸,把这个图纸传递给AutoMigrate
这个函数,让它在实际的工地(数据库),帮我建起与这个modle匹配的实实在在的房子(数据库中的table)。
DB.AutoMigrate(&Student{})
💡 注意!!!
AutoMigrate
的逻辑,只新增,不修改!
💁🏻♂️例如:将Name修改为Name1,进行迁移,会在原有name存在的情况下多出一个name1的字段- 对 原有结构体的字段的大小,可以进行修改字段的大小
Name string `gorm:"type:varchar(12)"`
Name string `gorm:"size:2"`
1.3:内置的gorm.Model
为了方便模型定义,GORM内置了gorm.Model
结构体。
gorm.Model
是一个包含ID
、CreatedAt
、UpdatedAt
、DeleteAt
四个字段的Golang结构体
// gorm.Model 定义
type Model struct {
ID uint `gorm:"primary_key"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt *time.Time
}
可以将其嵌入到自己定义的model中
// 将 `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt`字段注入到`User`模型中
type User struct {
gorm.Model
Name string
}
1.3.1:时间戳跟踪
可以发现,内置的gorm.Model
结构体有这样三个字段:
- CreateAt
该字段的值记录该条记录初次被创建的时间
db.Create(&user) // `CreatedAt`将会是当前时间
// 可以使用`Update`方法来改变`CreateAt`的值
db.Model(&user).Update("CreatedAt", time.Now())
- UpdateAt
记录每次更新记录的时间
db.Save(&user) // `UpdatedAt`将会是当前时间
db.Model(&user).Update("name", "jinzhu") // `UpdatedAt`将会是当前时间
- DeleteAt
在调用Delete
删除记录时,不会将该条记录直接从数据库删除,而是将DeleteAt
字段置为当前时间
1.4:字段标签
💁🏻♀️Gorm的字段标签是加在定义模型字段后的,用于指定字段的属性、关联关系、验证规则,以便GORM在操作数据库时使用
在使用结构体声明模型时,标签tags是可选项。常见的字段标签如下:
结构体字段标签tags | 描述 |
---|---|
type | 定义字段类型(sql中的 那几种,sql怎样指定类型,这里也一样) |
size | 自定义字段大小,大小单位是字节(Byte);默认值是255 |
precision | 其后加: ,后面加数字,用来标识列的精度,指定字段的总位数(包括小数点),如果超过precision规定,将截断或者出错。常用于列的值是浮点型情况 |
scale | 指定decimal 类型字段小数点后位数 |
column | 指定字段在数据库表中的列名,默认是取字段名为列名 |
primaryKey | 将该列定义为主键,即以该字段为一条记录的唯一标识,gorm可以使用该字段来查询、更新或者删除记录。一个模型只能有一个主键且不为空 |
unique | 指定该字段为唯一索引,限制字段的值必须唯一 |
default | 指定字段的默认值 |
not null | 限制该字段不可为空 |
embedded | 在数据库"物理意义"上,将一个结构体类型嵌入到另一个结构体类型中,这样,嵌入的结构体的字段可以被视作外部结构体的字段,可以像在外部结构体定义的普通字段一样进行操作 |
embeddedPrefix | 指定嵌入的结构体的字段的前缀,避免嵌入结构体中的字段名和外部结构体的字段名发生冲突 |
comment | 和sql中的comment一样,给字段注释作用 |
autoIncrement | 设置字段为自增类型,可以指定自增长主键起始值和步长 |
ignore | 忽略该模型字段,不映射到数据库表中 |
💁🏻♂️使用细节
- 标签写在结构体字段定义后面,用反引号括起
- 多个标签用
;
分隔 - 不同数据库的支持的标签可能有所不同,因此在使用时需要查看相应的文档或测试。
eg:
type User struct {
gorm.Model
Name string
Age sql.NullInt64
Birthday *time.Time
Email string `gorm:"type:varchar(100);unique_index"`
Role string `gorm:"size:255"` // 设置字段大小为255
MemberNumber *string `gorm:"unique;not null"` // 设置会员号(member number)唯一并且不为空
Num int `gorm:"AUTO_INCREMENT"` // 设置 num 为自增类型
Address string `gorm:"index:addr"` // 给address字段创建名为addr的索引
IgnoreMe int `gorm:"-"` // 忽略本字段
}
欢迎在评论区交流和留下你的想法和建议
如果对你有用,还请:💭评论+👍🏻点赞+⭐收藏+➕关注
- Java岛冒险记【从小白到大佬之路】
- LeetCode每日一题–进击大厂
- 算法
- C/C++
- Go语言核心编程
-[
欢迎在评论区交流和留下你的想法和建议
如果对你有用,还请:💭评论+👍🏻点赞+⭐收藏+➕关注
-
Java岛冒险记【从小白到大佬之路】
-
GORM框架学习
-
Mysql从入门到精通
-
Go语言核心编程
-
LeetCode每日一题–进击大厂
-
算法
-
C/C++
-
数据结构