Day08:GORM快速入门06 属于| 青训营

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Day08:GORM快速入门06 属于| 青训营

导读

本套笔记是学习完Gin框架之后的下一个阶段,通过Gin框架我们可以很方便的和前端进行交互,下一步就是和数据库进行交互,这就需要使用GORM。本套笔记就是带你快速上手GORM,学习完这个之后就可以完成大项目的开发了,后续还会进行大项目的讲解开发,制作不易,喜欢的就点个关注吧。

本套课程基于GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.进行讲解,是对这个的补充解释说明。

注意

代码详解大部分是注释的形式给出,请留意代码注释。

GORM介绍

GORM(Go Object Relational Mapping)是一个在 Go 语言中使用的优秀的 ORM(对象关系映射)库。它提供了简单且强大的 API,使开发人员能够轻松地与数据库进行交互

Belongs To

在 GORM 中,Belongs To 是一种定义模型之间关系的方式,表示一个模型属于另一个模型。

package main  
import (  
"gorm.io/driver/mysql"  
"gorm.io/gorm"  
)  
// 父级结构体  
type Parent struct {  
ID uint `gorm:"primaryKey"`//主键  
Name string `gorm:"column:name"`//指定了数据库表中对应的列名为 `name`  
}  
// 子级结构体  
type Child struct {  
ID uint `gorm:"primaryKey"` //主键  
Name string `gorm:"column:name"` //指定了数据库表中对应的列名为 `name`  
ParentID uint `gorm:"column:parent_id"` // 表示 Child 模型属于 Parent 模型  
Parent Parent `gorm:"foreignKey:ParentID"`  //表示 `Child` 模型的 `ParentID` 字段作为外键与 `Parent` 模型建立关联
}  
func main() {  
db, _ := gorm.Open(mysql.New(mysql.Config{  
DSN: "root:Lycdemima1@@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local", // DSN data source name  
DefaultStringSize: 256, // string 类型字段的默认长度  
DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持  
DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引  
DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列  
SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置  
}), &gorm.Config{}) //连接数据库  
db.AutoMigrate(&Parent{}, &Child{})//自动建表  
parent := Parent{Name: "John"}  
db.Create(&parent)  
child := Child{Name: "Alice", ParentID: parent.ID}  
db.Create(&child)  
}

运行之后表关系是这样的

image.png

image.png

外键

要定义一个 belongs to 关系,数据库的表中必须存在外键

外键的名字,使用拥有者的类型名称加上表的主键的字段名字

例如,定义一个User实体属于Company实体,那么外键的名字一般使用CompanyID

重写外键

gorm:"foreignKey:"用于自定义外键,也可以重写外键

package main  
import (  
"fmt"  
"gorm.io/driver/mysql"  
"gorm.io/gorm"  
)  
type Parent struct {  
ID uint `gorm:"primaryKey"`  
Name string `gorm:"column:name"`  
}  
type Child struct {  
ID uint `gorm:"primaryKey"`  
Name string `gorm:"column:name"`  
CustomParentID uint `gorm:"column:custom_parent_id"`  
Parent Parent `gorm:"foreignKey:CustomParentID"`//重写外键  
}  
func main() {  
db, err := gorm.Open(mysql.New(mysql.Config{  
DSN: "root:Lycdemima1@@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local", // DSN data source name  
DefaultStringSize: 256, // string 类型字段的默认长度  
DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持  
DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引  
DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列  
SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置  
}), &gorm.Config{}) //连接数据库  
err = db.AutoMigrate(&Parent{}, &Child{})  
if err != nil {  
panic("Failed to migrate database")  
}  
parent := Parent{Name: "John"}  
result := db.Create(&parent)  
if result.Error != nil {  
panic("Failed to create parent")  
}  
child := Child{Name: "Alice", CustomParentID: parent.ID}  
result = db.Create(&child)  
if result.Error != nil {  
panic("Failed to create child")  
}  
fmt.Println("Parent and child created successfully")  
}

运行之后表关系

image.png

image.png

重写引用

对于 belongs to 关系,GORM 通常使用数据库表,主表(拥有者)的主键值作为外键参考。 正如上面的例子,我们使用主表Company中的主键字段ID作为外键的参考值。

如果设置了User实体属于Company实体,那么GORM会自动把Company中的ID属性保存到User的CompanyID属性中。

以下是示例代码,展示了如何在 GORM 中使用 references 标签定义外键引用的列名:

type Child struct {
  ID           uint   `gorm:"primaryKey"`
  Name         string `gorm:"column:name"`
  ParentID     uint   `gorm:"column:parent_id"`
  Parent       Parent `gorm:"foreignKey:ParentID;references:ID"`
}

我们通过 gorm:"column:parent_id"ParentID 作为外键列名,并使用 references:ID 来指定外键引用的列名为 ID

外键约束

在 GORM 中,可以使用 constraint 标签来指定外键约束的名称和行为

type Child struct {
  ID           uint   `gorm:"primaryKey"`
  Name         string `gorm:"column:name"`
  ParentID     uint   `gorm:"column:parent_id;constraint:OnUpdate:CASCADE,OnDelete:SET NULL"`
  Parent       Parent `gorm:"foreignKey:ParentID"`
}

OnUpdate:CASCADE 表示在父表主键更新时,子表的外键会自动更新;OnDelete:SET NULL 表示在父表主键删除时,子表的外键会被设置为 NULL 值


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
Java 调度 流计算
有没有 大佬用 springboot 启动flink 处理 ,发现springboot 加 schedule调度处理会内存占满情况?
有没有 大佬用 springboot 启动flink 处理 ,发现springboot 加 schedule调度处理会内存占满情况?
494 6
|
监控 Nacos 微服务
集成nacos,使用钉钉发送服务下线告警
我们在集成微服务框架的时候,涉及服务太多,如果是单节点的话,遇到凌晨服务挂起的问题会很麻烦。并且原生的监控也不是很理想。这里结合nacos,再通过钉钉来发送服务下线告警,这样可在第一时间确定服务异常并及时处理。
814 0
|
存储 缓存 5G
时域结构 | 带你读《5G 空口设计与实践进阶 》之十七
在时域,NR 支持基于符号灵活定义的帧结构,以满足各种时延需求。
时域结构 | 带你读《5G 空口设计与实践进阶 》之十七
|
数据挖掘 UED
CRM系统用户满意度调查:哪些品牌最受欢迎
随着国内CRM市场的快速发展,众多厂商推出了各具特色的产品。为了帮助企业选择最适合的解决方案,我们进行了用户满意度调查,涵盖系统的功能、易用性、性价比、支持服务等多个维度。调查显示,纷享销客、Zoho CRM、Salesforce、HubSpot CRM等品牌表现突出,赢得了用户的广泛认可。这些品牌凭借强大的功能、灵活的定制化选项和优秀的用户体验,满足了不同规模和行业企业的需求。
|
9月前
|
图形学
unity 物体震动
在Unity中实现物体震动效果,主要通过改变物体的位置、旋转或缩放属性来模拟震动。以下是位置震动的实现原理及代码示例:通过随机生成微小偏移量并累加到物体位置上,在短时间内不断改变位置产生震动效果。生成随机偏移,并结合时间控制持续震动。
|
10月前
|
敏捷开发 运维 Devops
如何构建高效的价值交付系统?详解项目管理中的核心要素
3分钟了解价值交付系统的组成和使用方法。
308 0
如何构建高效的价值交付系统?详解项目管理中的核心要素
|
存储 运维 监控
云计算运维和传统运维工程师有何区别
云计算运维和传统运维工程师有何区别
636 1
|
测试技术 C语言
C语言中的void函数
C语言中的void函数
1315 1
|
安全 Go 开发者
Golang深入浅出之-Go语言中的CSP模型:深入理解并发哲学
【5月更文挑战第2天】Go语言的并发编程基于CSP模型,强调通过通信共享内存。核心概念是goroutines(轻量级线程)和channels(用于goroutines间安全数据传输)。常见问题包括数据竞争、死锁和goroutine管理。避免策略包括使用同步原语、复用channel和控制并发。示例展示了如何使用channel和`sync.WaitGroup`避免死锁。理解并发原则和正确应用CSP模型是编写高效安全并发程序的关键。
340 7
|
C++ Windows
【Visual Studio Code----Shader编程环境配置】
【Visual Studio Code----Shader编程环境配置】

热门文章

最新文章