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

勤奋不是嘴上说说而已,而是实际的行动,在勤奋的苦度中持之以恒,永不退却。业精于勤,荒于嬉;行成于思,毁于随。在人生的仕途上,我们毫不迟疑地选择勤奋,她是几乎于世界上一切成就的催产婆。只要我们拥着勤奋去思考,拥着勤奋的手去耕耘,用抱勤奋的心去对待工作,浪迹红尘而坚韧不拔,那么,我们的生命就会绽放火花,让人生的时光更加的闪亮而精彩。

导读:本篇文章讲解 【GORM框架】模型定义超详解,确定不来看看?,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

在这里插入图片描述

  • 博主简介:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、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:"-"` // 忽略本字段
}

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

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

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/142420.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!