Gorm 基础:表映射

这篇文章将以创建事件时间记录功能为示例,介绍如何使用 Gorm 完成数据库表的基本映射、简单的创建表数据操作和注意事项。

数据库表设计

设计一个事件时间记录功能通常需要记录事件的开始时间、结束时间和事件类型,以及一些额外的功能,像事件描述。下面提供一个简单的数据库表设计方案。

我们提供两张数据库表:记录类别表 Record_Type 和时间记录表 Time_Record。Record_Type 用于记录事件类型,时间记录表是主要的记录表,记录事件发生的起始时间和结束时间。基本结构如下:

Record_Type:

  • ID:唯一标识符
  • Type:时间类型

Time_Record:

  • ID:唯一标识符
  • start_time:事件起始时间
  • end_time:事件结束事件
  • Description:事件描述
  • type_id:事件类型ID

其中 Record_Type 和 Time_Record 的主键都是自增的唯一标识符,type_id 和 Record_Type 的 ID 建立外键约束,建表语句如下:

Record_Type:

CREATE TABLE Record_Types (ID INT AUTO_INCREMENT PRIMARY KEY,Type VARCHAR(255) NOT NULL
);

Time_Record:

CREATE TABLE Time_Records (ID INT AUTO_INCREMENT,start_time DATETIME NOT NULL,end_time DATETIME,Description TEXT,type_id INT,PRIMARY KEY (ID),FOREIGN KEY (type_id) REFERENCES Record_Types(ID)
);

需要注意的是这里的 start_time 非空而 end_time 可以为空,这会影响到我们 Go 语言中的结构体对应的字段类型。

使用 Gorm 映射数据库表

使用 Gorm 之后,我们可以使用 Go 语言中的结构体来映射数据库表,不同类型则对应不同字段。常见的映射有:INT 对应 intVARCHARTEXT 对应 stringDATETIME 等时间类型则使用 time.Time 来映射。上述映射都是针对数据库中的非空字段,而数据库中允许为空的字段,则替换成对应的指针类型。下面是实现上述示例映射的具体代码:

RecordType:

// RecordType 记录类别
type RecordType struct {// 主键ID   int `gorm:"primaryKey"`Type string
}

TimeRecord:

// TimeRecord 时间记录
type TimeRecord struct {// 主键ID          int `gorm:"primaryKey"`StartTime   time.TimeEndTime     *time.TimeDescription string// 外键约束TypeId int `gorm:"check: ID <> 'RecordType''"`
}

可以注意到上述 EndTime 字段的数据类型为 *time.Time ,这正是因为 end_time 在数据库表中没有声明为非空,所以我们使用time.Time 的指针类型来表示。另外,在 Gorm 中主键和外键的声明则是通过标签来完成的。TimeRecord 表中 ID 字段类型声明后跟的 gorm:"primaryKey"就是主键标签。如果你需要建立联合主键,则可以通过对多个字段同时加上主键标签,并且注意字段顺序的编排,因为 Gorm 会根据字段顺序来确定联合主键的顺序。外键则是使用 gorm:"check: ID <> 'RecordType 标签来声明的其中的 RecordType 指定表,ID 指定表中的字段。

名称映射

我们在给结构体和字段体起名时需要额外注意 Gorm 的名称映射规则:

  1. 结构体的字段名称会默认映射为数据库表的字段名。但是结构体名需要是单数形式,例如 RecordType 对应表 record_typesTimeRecord 对应表 time_records

  2. RecordType 并不会映射为 recordtypes 而是带下划线的 record_types。这条规则同时适用于字段名和结构体名称。

通过 Gorm 插入表数据

结构体设计完成之后,我们可以创建一个专门用于插入数据行的函数,方便后续使用。而插入数据的方式也很简单,主要分两步:创建结构体,然后调用 *gorm.DB Create 即可。示例如下:

// CreateType 创建新记录类别
func CreateType(db *gorm.DB, typeName string) (*RecordType, *gorm.DB) {rtype := &RecordType{Type: typeName,}result := db.Create(rtype)return rtype, result
}
// StartRecord 开启新记录
func StartRecord(db *gorm.DB, description string, recordTypeId int) (*TimeRecord, *gorm.DB) {record := &TimeRecord{StartTime:   time.Now(),Description: description,TypeId:      recordTypeId,}result := db.Create(record)return record, result
}

可以注意到,对于自增的 ID 主键,我们在创建结构体时对其省略。但是需要注意的是对于非空且没有默认值的对象,我们进行省略是存在风险的,如 time.Time 类型的非空对象省略后,Gorm 会将结构体初始化时的零值赋给其转换的 SQL 语句从而导致错误。

到此,简单的 Gorm 表映射便完成了。

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

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

相关文章

代码生成技术技术-janino

文章目录 背景简单例子flink 例子 背景 代码生成技术适合在需要动态代码编译的场景中使用。比如大数据计算场景下&#xff0c;经常会要把flink sql 转成实际的执行计划 简单例子 代码是一个string 类型&#xff0c;直接用janino 编译后&#xff0c;就可以得到加载到jvm里的c…

北京地铁用什么数据结构来处理

北京地铁信息查询系统或相关数据分析系统可能会使用多种数据结构来高效地处理和存储信息。以下是几种可能用到的数据结构及其用途&#xff1a; 图&#xff08;Graph&#xff09;&#xff1a;北京地铁线路可以被建模为一个有向加权图&#xff0c;其中每个站点是一个节点&#xf…

赶论文不用愁:如何利用ChatGPT在3小时内完成论文

在这份指南里&#xff0c;我将详细介绍如何运用ChatGPT 4.0的高级功能来辅助学术研究与文章写作。从挖掘研究课题的初步想法开始&#xff0c;到撰写一篇内容深刻、结构完整的学术论文&#xff0c;我将逐步演示如何在研究的各个阶段中充分利用ChatGPT。值得一提的是&#xff0c;…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 07:编码中的假象

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

POSTMAN接口详解

Postman接口详解 Postman 是一个流行的API开发工具&#xff0c;广泛应用于测试、开发和文档编写。它支持发送各种HTTP请求&#xff0c;管理请求参数、标头、认证和脚本&#xff0c;帮助开发者快速调试和验证API接口的正确性。以下是对Postman接口的详细讲解。 Postman基本功能…

二进制炸弹的fp是什么?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

微信小程序组件

微信小程序组件课后小结 引言 随着移动互联网的快速发展&#xff0c;微信小程序已经成为开发者和用户的重要选择之一。小程序以其轻量化、易用性和高效性&#xff0c;为开发者提供了一种全新的开发方式&#xff0c;也为用户带来了更加便捷的服务体验。本文将对微信小程序组件的…

BigDecimal 小数位的处理(RoundingMode)

前言&#xff1a; 在日常项目开发中&#xff0c;接触小数是常有的事情&#xff0c;而产品对于小数的处理&#xff0c;在不同的业务中有不同的定义&#xff0c;比如四舍五入、截取、向上舍位、向下舍位等等场景&#xff0c;面对如此多的场景&#xff0c;你是否会束手无策&#…

【算法】优先级队列-基础与应用

优先级队列&#xff08;Priority Queue&#xff09;是一种特殊的队列类型&#xff0c;它允许在其元素中分配优先级。与传统的先进先出&#xff08;FIFO&#xff09;队列不同&#xff0c;优先级队列中元素的出队顺序取决于它们的优先级。优先级较高的元素会被优先处理&#xff0…

IOS Swift 从入门到精通: 结构体的访问控制、静态属性和惰性

文章目录 初始化器引用当前实例惰性属性静态属性和方法访问控制总结初始化器 初始化器是一种特殊方法,可提供创建结构体的不同方式。所有结构体都默认带有一个初始化器,称为成员初始化器- 它会要求您在创建结构体时为每个属性提供一个值。 User如果我们创建一个具有一个属性…

windows桌面运维---第八天

1、如何判断环路&#xff1a; 1、执行ping命令&#xff1a;网络测试时发现丢包严重&#xff0c;可能是环路引起的 2、监控MAC地址漂移&#xff1a;频繁的MAC漂移是环路的一个迹象。 3、通过display interface brief | include up命令&#xff0c;查看所有UP接口下的流量 2、…

【Qt笔记①】帮助文档、窗口、按钮、信号和槽、lambda表达式

学习第一天&#xff1a;2024-3-9 文章目录 Qt creator 快捷键帮助文档默认生成的main.cpp逐行解释核心类帮助文档的查阅方法-①代码创建按钮第一个第二个对窗口的其他设置 对象树窗口坐标系信号和槽&#xff08;优点&#xff1a;松散耦合&#xff09;帮助文档的查阅方法-②找信…

价格减免(Lc2288)——模拟

句子 是由若干个单词组成的字符串&#xff0c;单词之间用单个空格分隔&#xff0c;其中每个单词可以包含数字、小写字母、和美元符号 $ 。如果单词的形式为美元符号后跟着一个非负实数&#xff0c;那么这个单词就表示一个 价格 。 例如 "$100"、"$23" 和 …

轨迹规划系列之S型速度曲线绝对值定位功能块(Codesys源代码)

1、轨迹规划的作用 轨迹规划的作用(前馈速度+位置插补)-CSDN博客文章浏览阅读13次。轨迹规划可以产生运动控制系统位置闭环控制所需要的前馈速度和插补位置值。前馈速度+PID位置闭环控制典型应用可以参考下面文章链接:1、S7-1200PLC和V90伺服通过工艺对象实现定位控制S7-1200…

Java中的加密与解密:实现安全的数据传输

Java中的加密与解密&#xff1a;实现安全的数据传输 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在当今信息安全至关重要的时代&#xff0c;保护数据的安全性…

表驱动法 -优化逻辑分支

表驱动法 -优化逻辑分支 定义 表驱动法&#xff08;Table-Driven Approach&#xff09;是一种编程模式&#xff0c;可以将输入变量作为直接或间接索引在表里查找所需的结果或处理函数&#xff0c;而不使用逻辑语句&#xff08;if-else 和 switch-case&#xff09;。索引表可以…

VMware与windows的共享文件夹没找到怎么办?

如果这样子添加&#xff0c;在ubuntu中还是没能找到。开机后有的时候仍然未发现共享文件夹。 二、解决办法 使用如下指令&#xff1a; sudo mount -t fuse.vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other /mnt/hgfs/ 是挂载点&#xff0c;也可以指定其它挂载点 -o allow_other…

DHCP原理1-单个局域网出现多个DHCP服务器会发生什么

1. 背景 DHCP全称是Dynamic Host Configuration Protocol。其协议标准是RFC1541&#xff08;已被RFC2131取代&#xff09;&#xff0c;主要实现服务器向客户端动态分配IP地址&#xff08;如IP地址、子网掩码、网关、DNS&#xff09;和配置信息。其系统架构是标准的C/S架构。RFC…

自学SAP是学习ECC版本还是S4版本?

很多人想学SAP&#xff0c;问我应该学ECC版本还是S4版本&#xff0c;我的建议如果你是自学的话&#xff0c;我个人建议使用ECC版本就行&#xff0c;因为这两个版本前台业务和后台配置的操作差异并不大&#xff0c;主要差异在于数据库的差异&#xff0c;前台业务操作和后台系统配…

OS复习笔记ch12-1

文件系统 概述 文件是大多数应用程序的核心要素&#xff0c;文件系统是操作系统对用户来说最重要的部分之一。 本章的主要内容见下图&#xff1a; 文件&#xff0c;大家耳熟能详的就是的docx、pdf、jpg、MP4等各种后缀文件&#xff0c;根据任务需要文件又分成了文本、图片、…