Golang Gorm 一对多的添加

news2024/11/26 4:44:34

一对多的添加有两种情况:

  • 一种是添加用户的时候同时创建文章
  • 其次是创建文章关联已经存在的用户。
package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// User 用户表 一个用户拥有多篇文章
type User struct {
	ID       int64
	Name     string    `gorm:"size:6"`
	Articles []Article //用户拥有的文章列表 has many
}

type Article struct {
	ID     int64  `gorm:"size:4"`
	Title  string `gorm:"size:16"`
	UserID int64  //属于  belongs to
}

func (*User) TableName() string {
	return "user"
}

func (*Article) TableName() string {
	return "article"
}

func main() {
	dsn := "root:7PXjAkY!&nlR@tcp(192.168.11.128:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
	db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	db.Debug().AutoMigrate(&User{}, &Article{})

	var u User
	a1 := Article{
		Title: "redis",
	}

	u = User{
		Name: "yanzi",
		Articles: []Article{
			{
				Title: "golang",
			},
			{
				Title: "k8s",
			},
			a1,
		},
	}

	db.Debug().Create(&u)
}


[8.981ms] [rows:3] INSERT INTO `article` (`title`,`user_id`) VALUES ('golang',2),('k8s',2),('redis',2) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user
_id`)

[14.812ms] [rows:1] INSERT INTO `user` (`name`) VALUES ('yanzi')

最后一种就是关联已有用户

	var articles []Article
	articles = []Article{
		{
			Title:  "cherry",
			UserID: 2,
		},
		{
			Title:  "marry",
			UserID: 2,
		},
	}

	db.Debug().Create(&articles)

[11.754ms] [rows:2] INSERT INTO `article` (`title`,`user_id`) VALUES ('cherry',2),('marry',2)

外键添加


	var u User
	db.Debug().Take(&u, 3)

	var a Article
	db.Debug().Take(&a, 7)

	u.Articles = []Article{a}
	db.Debug().Save(&u)


[1.300ms] [rows:1] SELECT * FROM `user` WHERE `user`.`id` = 3 LIMIT 1

[1.629ms] [rows:1] SELECT * FROM `article` WHERE `article`.`id` = 7 LIMIT 1

[2.901ms] [rows:2] INSERT INTO `article` (`title`,`user_id`,`id`) VALUES ('marry',3,7) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user_id`)

[6.363ms] [rows:0] UPDATE `user` SET `name`='test' WHERE `id` = 3

[0.557ms] [rows:0] INSERT INTO `article` (`title`,`user_id`,`id`) VALUES ('marry',3,7) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user_id`)

[3.713ms] [rows:0] INSERT INTO `user` (`name`,`id`) VALUES ('test',3) ON DUPLICATE KEY UPDATE `name`=VALUES(`name`)



mysql> select * from user;
+----+-------+
| id | name  |
+----+-------+
|  1 | lucas |
|  2 | yanzi |
|  3 | test  |
+----+-------+
mysql> select * from article;
+----+--------+---------+
| id | title  | user_id |
+----+--------+---------+
|  1 | golang |       1 |
|  2 | k8s    |       1 |
|  3 | golang |       2 |
|  4 | k8s    |       2 |
|  5 | redis  |       2 |
|  6 | cherry |       2 |
|  7 | marry  |       3 |
+----+--------+---------+

	var u User
	db.Debug().Take(&u, 3)

	var a Article
	db.Debug().Take(&a, 6)

	db.Debug().Model(&u).Association("Articles").Append(&a)


[2.196ms] [rows:2] INSERT INTO `article` (`title`,`user_id`,`id`) VALUES ('cherry',3,6) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user_id`)

model是声明映射关系的对象类型,通过这个对象类型,找到表名和字段。

	var u User
	db.Debug().Take(&u, 3)

	var a Article
	db.Debug().Take(&a, 5)

	db.Debug().Model(&u).Association("Articles").Append(&a)


[1.409ms] [rows:1] SELECT * FROM `user` WHERE `user`.`id` = 3 LIMIT 1

[1.254ms] [rows:1] SELECT * FROM `article` WHERE `article`.`id` = 5 LIMIT 1

[2.285ms] [rows:2] INSERT INTO `article` (`title`,`user_id`,`id`) VALUES ('redis',3,5) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user_id`)

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

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

相关文章

强强联袂,产教融合丨知了汇智与成都世纪超体达成战略合作

为了共培数字营销人才,实现产业、教育双向赋能,为地方乃至全国电商发展注入源源不断的行业性人才,8月24日,成都知了汇智科技有限公司(以下简称“知了汇智”)与成都世纪超体科技有限公司(以下简称…

科技资讯|苹果发布新专利:可在车内定位苹果的智能设备

根据美国商标和专利局近期公示的清单,苹果公司获得了一项名为《车内定位移动设备的系统和方式》专利,概述了在车内狭窄空间内如何定位 iPhone 等移动设备。 Find My 服务现阶段没有使用 UWB 来追踪 iPhone 或者 iPad,而是依赖 GPS 等相关辅…

iTubeGo for Mac视频下载器

iTubeGo YouTube Downloader是一款功能强大的YouTube视频下载工具, 它具有以下特色: 多种格式支持:iTubeGo YouTube Downloader可以将YouTube视频下载为多种常见的视频和音频格式,包括MP4、MP3、AVI、FLV、MOV、WMV等&#xff0c…

RFID服装管理系统:点亮时尚世界的新星

今天我们要聊聊一个真正酷炫的系统——RFID服装管理系统。別担心,我会用最地道的方式跟你聊,咱们来解开这神秘的时尚密码吧! 首先,先別怕,RFID其实是射频识别技术的缩写。别觉得高大上,其实就是让你的服装…

docker容器查看所有没使用的镜像,并删除

文章目录 场景1. 删除不用的容器删除无效容器2. 删除不用的镜像 场景 最近工作中遇到服务器磁盘紧张的情况,想到docker镜像和容器可以删除些不用的,省出来一些空间。具体操作如下: 1. 删除不用的容器 首先执行命令 docker ps -a 查看容器列表&#xff…

Maven 基础之安装和命令行使用

Maven 的安装和命令行使用 1. 下载安装 下载解压 maven 压缩包(http://maven.apache.org/) 配置环境变量 前提:需要安装 java 。 在命令行执行如下命令: mvn --version如出现类似如下结果,则证明 maven 安装正确…

ZeroMQ入门

官网: ZeroMQ 简介 ZeroMQ是一个库,不是消息队列也不是消息中间件,介于应用层和传输层之间(按照TCP/IP划分)。 传统的Socket通信模式需要创建连接,销毁连接,选择协议等一些列操作。而ZeroMQ是在Socket封…

①matlab的命令掌握

目录 输入命令 命名变量 保存和加载变量 使用内置的函数和常量 输入命令 1.您可以通过在命令行窗口中 MATLAB 提示符 (>>) 后输入命令 任务 使用命令 3*5 将数值 3 和 5 相乘。 答案 3*5 2.除非另有指定,否则 MATLAB 会将计算结果存储在一个名为 ans…

No119.精选前端面试题,享受每天的挑战和学习

文章目录 实现栈,有入栈出栈的方法,以及length属性如何封装组件单页应用怎么跨页面传参权限怎么设计的map和forEach对于对象类型会不会改变 实现栈,有入栈出栈的方法,以及length属性 可以通过 JavaScript 的数组来实现一个栈结构…

倒数 2 周|期待 2023 Google开发者大会

9 月 6-7 日,中国上海 前沿科技,新知同享 趣味体验,灵感齐聚 技术生态,多元共进 关注官网最新信息,敬请期待大会开幕 2023 Google 开发者大会官网 相信你一定记得,在今年 5 月的 Google I/O 大会上&am…

考察交流 | 九江市浔阳区委常委、副区长雷霆钧一行考察中创算力

考察交流 8月25日,九江市浔阳区委常委、副区长雷霆钧来访中创算力开展招商考察,中创董事长许伟威热情接待了调研领导一行。浔阳区数字经济发展中心主任曹超成、九江电信浔阳分局局长黄健、九江新联智创董事长刘诚志、德国石荷州中资企业协会副会长陈虹瑾…

SAP从放弃到入门系列之abapGit安装

文章目录 一、概括二、系统环境三、安装独立版本四、安装开发者版本4.1、在线安装(推荐)4.2、离线安装 前段时间看了汪子熙老师关于abap2UI5的文章,感觉很有意思,来了解一下。abapGit 安装的文章已经有很多了,但是为了在系统里使用…

redis windows 版本安装

1. 下载windows安装包并解压 如果是Linux版本可以直接到官网下载,自3.x起官网和微软网站就没有redis安装包更新了,好在github有开发者在编译发布更新(目前最新有5.0.9版本可下),地址:redis windows 5版本下…

即时通讯开发中的5个难点及解决方案

在当今数字化时代,人们越来越依赖即时通讯应用程序进行实时消息传递、语音通话和视频聊天。然而,即时通讯开发并非易事,开发人员需要克服许多技术和功能上的挑战。以下是即时通讯开发过程中最常见的5个难点,以及专家们提出的解决方…

新闻稿发布策略:选择合适渠道,让品牌故事传遍大江南北

新闻稿是企业宣传和传媒报道的重要工具,它可以传达企业的最新动态、产品推出、重要事件等信息。而如何正确发布新闻稿,选择合适的发布渠道,对于提高新闻稿的曝光度和影响力至关重要。在本文中,我们一秒推小编将探讨新闻稿的发布方…

完美解决Ubuntu网络故障,连接异常,IP地址一直显示127.0.0.1

终端输入ifconfig显示虚拟机IP地址为127.0.0.1&#xff0c;具体输出内容如下&#xff1a; wxyubuntu:~$ ifconfig lo: flags73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen …

Linux必备的5款神仙国产软件,让你工作效率成倍提升

随着近些年来国产化计算机的普及&#xff0c;国内的Linux用户逐渐开始多了起来&#xff0c;虽然Linux操作系统的生态不像Windows那么完善&#xff0c;有众多办公软件可以选择&#xff0c;但也有一定数量的软件资源&#xff0c;其中也包括一些优秀的国产软件。下面我将为大家分享…

【VS Code插件开发】状态栏(五)

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端舵手 &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域优质作者、阿里云专家博主&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4e2; 资料领取&#xff1a;前端…

uniapp 实现地图距离计算

在uniapp中实现地图距离计算可以借助第三方地图服务API来实现。以下是一种基本的实现方式&#xff1a; 注册地图服务API账号&#xff1a;你可以选择使用高德地图、百度地图等提供地图服务的厂商&#xff0c;注册一个开发者账号并获取API密钥。 安装相关插件或SDK&#xff1a;根…

怎么选择自定义工作流自定义表单?

在快节奏社会中&#xff0c;传统的表单制作已经无法胜任日益繁琐的办公工作了&#xff0c;只有选择更有优势的自定义工作流自定义表单工具&#xff0c;才能提质、降本、增效&#xff0c;为不同领域的客户朋友带来可观的市场效益。选好专业的低代码技术平台&#xff0c;就可以在…