【GORM框架】模型定义超详解,确定不来看看?

在这里插入图片描述

  • 博主简介:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。
  • 博主主页: @是瑶瑶子啦
  • 所属专栏: GORM框架学习
  • 近期目标:写好专栏的每一篇文章

在这里插入图片描述

一、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是一个包含IDCreatedAtUpdatedAtDeleteAt四个字段的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:"-"` // 忽略本字段
}

欢迎在评论区交流和留下你的想法和建议

如果对你有用,还请:💭评论+👍🏻点赞+⭐收藏+➕关注

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是瑶瑶子啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值