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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 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 值


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SQL 关系型数据库 MySQL
gin框架学习-Gorm入门指南
Snake Case命名风格,就是各个单词之间用下划线(_)分隔,首字母大写区分一个单词,例如: CreateTime的Snake Case风格命名为create_time
450 0
gin框架学习-Gorm入门指南
|
6月前
|
存储 关系型数据库 MySQL
|
前端开发 Go API
Day08:GORM快速入门07 has many| 青训营
Day08:GORM快速入门07 has many| 青训营
|
SQL 关系型数据库 Go
Golang微服框架Kratos与它的小伙伴系列 - ORM框架 - GORM
[GORM](https://gorm.io/index.html) 是基于Go语言实现的ORM库,它是Golang目前比较热门的数据库ORM操作库,对开发者也比较友好,使用非常方便简单。
142 0
|
前端开发 Go API
Day07:GORM快速入门04 查找| 青训营
Day07:GORM快速入门04 查找| 青训营
|
存储 Java 关系型数据库
No1.入门第一课,我的go开发之旅
No1.入门第一课,我的go开发之旅
|
前端开发 Go API
Day08:GORM快速入门08 many to many| 青训营
Day08:GORM快速入门08 many to many| 青训营
|
存储 前端开发 Go
Day08:GORM快速入门06 HasOne| 青训营
Day08:GORM快速入门06 HasOne| 青训营
|
关系型数据库 MySQL Go
Day06:GORM快速入门01 入门指南| 青训营
Day06:GORM快速入门01 入门指南| 青训营
|
前端开发 Go API
Day06:GORM快速入门03 删除| 青训营
Day06:GORM快速入门03 删除| 青训营