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

news2024/11/13 9:42:37

在这里插入图片描述

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

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

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

在这里插入图片描述

  • Java岛冒险记【从小白到大佬之路】
  • LeetCode每日一题–进击大厂
  • 算法
  • C/C++
  • Go语言核心编程
    -[
    欢迎在评论区交流和留下你的想法和建议

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

在这里插入图片描述

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

  • GORM框架学习

  • Mysql从入门到精通

  • Go语言核心编程

  • LeetCode每日一题–进击大厂

  • 算法

  • C/C++

  • 数据结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/481188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ansible自动化运维工具---Playbook

Ansible自动化运维工具--playbook 一、playbook1、playbook简介2、playbook应用场景3、yaml基本语法规则4、yaml支持数据结构 二、Inventory中的变量1、inventor变量参数 三、playbook实例1、编写httpd的playbook2、tasks列表和action3、条件测试4、迭代5、with_items模块6、te…

5.4.1树的存储结构 5.4.2树和森林的遍历

回忆一下树的逻辑结构: 双亲表示法(顺序存储) 如果增加一个结点M,L。毋须按照逻辑上的次序存储。 如果是删除元素: 方案一:比如说删除元素为G,设置其双亲结点为-1。 方案二: 把尾部的结点提上…

真题详解(对象)-软件设计(六十四)

真题详解(DNS)-软件设计(六十三)https://blog.csdn.net/ke1ying/article/details/130448106 TCP和UCP都提供了_____能力。 端口寻址 解析: UDP是不可靠无连接协议,没有连接管理,没有流量控制,没有重试。 面向对象…

MySQL 常用命令

#--------------------------- #----cmd命令行连接MySql--------- cd C:\Program Files\MySQL\MySQL Server 5.5\bin # 启动mysql服务器 net start mysql # 关闭mysql服务器 net stop mysql # 进入mysql命令行 mysql -h localhost -u root -p 或mysql -u root -p #---------…

推荐算法实战项目:AutoRec模型原理以及案例实战(附完整 Python 代码)

本文要介绍的AutoRec模型是由澳大利亚国立大学在2015年提出的,它将自编码器(AutoEncoder)的思想与协同过滤(Collaborative Filter)的思想结合起来,提出了一种单隐层的简单神经网络推荐模型。 可以说这个模型的提出,拉开了使用深度学习解决推…

LVS - DR 模式集群搭建

VIPRIPweb1192.168.88.136httpdweb2192.168.88.139httpdLVS192.168.88.110192.168.88.144(DIP) 省略最后的共享存储,webserver内容不一致(方便查看负载的效果),关闭防火墙,关闭se 1、配置web服务 web1和web2相同 y…

【文件描述符|重定向|缓冲区】

1 C语言文件操作的回顾 这块博主在讲解C语言时就已经做了很详细的讲解&#xff0c;这里就不详细讲了&#xff0c;直接给出代码。 写操作&#xff1a; #include<stdio.h> #include<stdlib.h> #include<errno.h> #define LOG "log.txt" …

【STM32CubeMX】外部中断

前言 本文记录下我学习STM32CubeMX时的流程&#xff0c;方便以后回忆。本章记录外部中断。 步骤 该实验步骤以&#xff0c;配置PA1为外部中断下降沿触发事件&#xff0c;在触发事件后点亮板载PC13LED灯 时钟配置和生成文件配置之类的&#xff0c;其它文章讲过了&#xff0c;这…

MySQL高级篇——性能分析工具

导航&#xff1a; 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线设计模式牛客面试题 目录 1. 数据库服务器的优化步骤 2. 查看系统性能参数 2.1 SHOW STATUS LIKE 参数 2.2 查看SQL的查询成本 3. 定位执行慢的 SQL&am…

【Java虚拟机】JVM垃圾回收机制和常见回收算法原理

1.垃圾回收机制 &#xff08;1&#xff09;什么是垃圾回收机制&#xff08;Garbage Collection&#xff0c; 简称GC) 指自动管理动态分配的内存空间的机制&#xff0c;自动回收不再使用的内存&#xff0c;以避免内存泄漏和内存溢出的问题最早是在1960年代提出的&#xff0c;程…

20230501-win10-制作U盘启动盘-firpe

20230501-win10-制作U盘启动盘-firpe 一、软件环境 zh-cn_windows_10_consumer_editions_version_22h2_updated_march_2023_x64_dvd_1e27e10b.isofirpe 1.8.2标签&#xff1a;firpe win10分栏&#xff1a;WINDOWS 二、硬件环境 8G或以上的U盘一个FX86笔记本一台 三、官方下…

2。硬件基础知识

介绍嵌入式软件开发所需要了解的硬件基础知识&#xff0c;与软件相结合学习 一 电阻 阻值&#xff1a;直标法&#xff0c;或色标法&#xff08;碳膜电阻上的横线&#xff09; 类型&#xff1a;线性&#xff0c;非线性&#xff08;压敏电阻、热敏电阻&#xff09; 基本参数&a…

HQL - 查询首次下单后第二天连续下单的用户比率

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 题目&#xff1a; 从订单信息表(order_info)中查询首次下单后第二天仍然下单的用户占所有下单用户的比例&#xff0c;结果保留一位小数&#xff0c;使用百分数显示&#xff0c; 解题&#xff1a; …

STL常用梳理——STRING

容器——string篇 STL简介String常见接口函数深度了解String构造函数拷贝构造赋值重载析构函数运算符重载查找 STL简介 STL(Standard Template Library,标准模板库)&#xff0c;是惠普实验室开发的一系列软件的统 称。现在主要出现在 c中&#xff0c;但是在引入 c之前该技术已…

Day959.架构现代化模式 -遗留系统现代化实战

架构现代化的新城区模式 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于架构现代化的新城区模式的内容。 前面的四个现代化并不是层层递进的关系&#xff0c;而是既可以同时进行&#xff0c;也可以颠倒顺序。 比如&#xff0c;既可以先重构代码&#xff0c;再拆分…

在外远程NAS群晖Drive - 群晖Drive挂载电脑磁盘同步备份【无需公网IP】

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 转发自CSDN远程穿透的文章&#xff1a;【…

DAY07_常用API下

1&#xff1a;String 1.1 String(构造方法) String类&#xff0c;它涉及到两个案例&#xff1a;用户登录和聊天室。 先来看用户登录案例&#xff1a;需要输入用户名和密码&#xff0c;和已知的用户名和密码进行比较&#xff0c;涉及到比较的方法&#xff0c; 一般来说&…

【Springboot+Vue+MP+ElementUI+axios项目实战记录】

写在最前&#xff1a;仅用于记录项目中遇到的问题&#xff0c;并不一定解决 1、 想要实现&#xff0c;点击配置自动跳转页面 2、 虽然使用了push追加了url&#xff0c;但是在跳转下一个&#xff0c;比如 配置跳转到用户会因为之前的url是http://localhost:8080/admin/pagetw…

【SpringBoot】MyBatisPlus代码生成器

项目准备 数据库 MySql 5.7 新建数据库votedb&#xff0c;新建两个测试表user、vote_theme user表 vote_theme表 建表代码如下 -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS user; CREATE TABLE…