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

这篇具有很好参考价值的文章主要介绍了【GORM框架】模型定义超详解,确定不来看看?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

【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:"-"` // 忽略本字段
}

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

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

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

  • Java岛冒险记【从小白到大佬之路】

  • GORM框架学习

  • Mysql从入门到精通

  • Go语言核心编程

  • LeetCode每日一题–进击大厂

  • 算法

  • C/C++

  • 数据结构文章来源地址https://www.toymoban.com/news/detail-431255.html

到了这里,关于【GORM框架】模型定义超详解,确定不来看看?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据挖掘 | 数据预处理】缺失值处理 & 重复值处理 & 文本处理 确定不来看看?

    🤵‍♂️ 个人主页: @AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱‍🏍 🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能硬件(虽然硬件还没开始玩,但一直

    2024年02月07日
    浏览(34)
  • 【微信小程序入门到精通】— swiper 超详细的属性值讲解!确定不来看看?

    对于目前形式,微信小程序是一个热门,那么我们该如何去学习并且掌握之后去做实际项目呢? 为此我特意开设此专栏,在我学习的同时也将其分享给大家! 本篇文章主要介绍我们微信小程序 swiper 的常用属性,接下来我们将逐一讲解。 如果在往下阅读的过程中,有什么错

    2024年02月08日
    浏览(36)
  • 【版本管理 | Git 】Git最佳实践系列(一) —— LFS & .gitignore 最佳实践,确定不来看看?

    🤵‍♂️ 个人主页: @AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱‍🏍 🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能硬件(虽然硬件还没开始玩,但一直

    2024年02月20日
    浏览(38)
  • 【HTML | CSS | JAVASCRIPT】一款可交互的响应式登陆注册表单,你确定不来看看嘛(附源码)

    💂 作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发

    2023年04月16日
    浏览(44)
  • 【云原生 | Docker】Linux 定时自动化备份Mysql数据到本地 & Windows 最佳实践,确定不来看看?

    🤵‍♂️ 个人主页: @AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱‍🏍 🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能硬件(虽然硬件还没开始玩,但一直

    2024年02月02日
    浏览(47)
  • golangORM框架Gorm

    ORM框架Gorm gorm简介 gorm声明模型 gorm连接到数据库 gorm创建记录 gorm查询记录 gorm高级查询 gorm更新 gorm删除 SQL 构建器 gorm Belongs To关系 gorm Has One关系 gorm Has Many关系 gorm Many To Many关系 gorm 实体关联 gorm 会话 gorm事务 Gorm总结

    2024年02月10日
    浏览(27)
  • gin和gorm框架安装

    理论上只要这两句命令 然而却出现了问题 貌似是代理问题,加上一条命令 或者试试这个  可以成功安装 安装gorm的数据库驱动程序

    2024年02月14日
    浏览(32)
  • 【GORM框架】一文学会用gorm实现对单表的增删改查操作

    博主简介: 努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。 博主主页: @是瑶瑶子啦 所属专栏: GORM框架学习 近期目标: 写好专栏的每一篇文章 在上一篇Gorm文章中,我们学习了如何使用gorm进行数据库的连接和一些

    2024年02月03日
    浏览(79)
  • gin+gorm增删改查目录框架

    从网上找资料,发现,很多都是直接的结构 路由,后端的controller层,还有model层,都是放在了同一个main.go文件中,如果写项目的话,还得自己去拆文件,拆代码,经过查询和自己总结,下面放一个目录框架 总体目录结构 按照业务流程顺序,解释说明 1、加载自定义封装函数文

    2024年01月19日
    浏览(34)
  • golang操作数据库--gorm框架、redis

    ①引入 ②初始化 ③增删改查 官网: http://gorm.io/ ①引入 ②初始化 ③增删改查 说明:Debug()可以查看执行的sql语句。 ④gorm gen的使用 a.先安装 (会安装到gopath的bin目录下,windows电脑,需要将该路径加入到系统路径) eg : b.举例: 说明1:windows电脑go install之后,把exe添加到系统路

    2024年02月10日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包