首页 > 其他分享 >Golang Gorm 一对多的添加

Golang Gorm 一对多的添加

时间:2023-09-07 16:34:57浏览次数:38  
标签:db id Golang 添加 user Debug Article Gorm User


Golang Gorm 一对多的添加_User

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

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

添加用户的时候同时创建文章


Golang Gorm 一对多的添加_ci_02

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
    User   User   //属于  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)

创建用户文章并且关联


db.Debug().Create(&Article{
		Title: "c",
		User: User{
			Name: "yanzi",
		},
	})
var u User
	db.Debug().Take(&u, 2)
	db.Create(&Article{
		Title: "php",
		User:  u,
	})

 

  • model是声明映射关系的对象类型,通过这个对象类型,找到表名和字段。
  •  Association 是关联某个一对多的字段   
  • find是查找一对多关系 append是更新或者新增一对多关系

 Association 关联的是字段,为字符串。后面的find和append是具体的结构体指针变量!!!


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


外键添加  现有文章关联已有用户


Golang Gorm 一对多的添加_golang_03

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 |
+----+--------+---------+

Golang Gorm 一对多的添加_User_04

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`)

外键添加  现有用户关联文章 


Golang Gorm 一对多的添加_ci_05

标签:db,id,Golang,添加,user,Debug,Article,Gorm,User
From: https://blog.51cto.com/u_14035463/7398527

相关文章

  • golang panic和log.Fatal
    log.Fatal相当于Print后调用os.Exit(1)import"log"funcmain(){ deferfunc(){ log.Println("mainexit") }() log.Println("mainrun") log.Fatalln("Fatalerr")}运行结果,程序直接退出defer没有被执行#gorun.2023/09/0519:......
  • golang操作mysql
    golang操作mysql在Go语言中,你可以使用第三方库来进行MySQL数据库的操作。其中,比较常用的库有database/sql和github.com/go-sql-driver/mysql在安装了MySQL的前提下进行以下操作1下载依赖在终端执行命令:goget-ugithub.com/go-sql-driver/mysql2导入依赖库import(......
  • buildroot 构建根文件系统(6)添加字体和中文支持
    一、开发背景构建最小系统后成功运行后,Qt程序在界面上文本不显示二、开发需求Qt库编译的程序可以正常运行三、开发环境LinuxUbuntu4.15.0-65-generic+buildroot-2023.02.3+i.mx6d(cortex-A9)四、实现步骤1、添加界面中文支持1)基于前面章......
  • 按钮触发table添加一行删除一行
    <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html> <head> <title>addHtml.html</title> <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3"> <meta......
  • MySQL或MariaDB查询数据添加序号
    1.通用方法:使用@变量SELECT@row_number:=@row_number+1ASrow_number,a.dept_nameFROMsys_departmenta,(SELECT@row_number:=0)bORDERBYdept_name;2.高版本即MySQL8.0或MariaDB10.5开始支持的ROW_NUMBER()函数SELECTROW_NUMBER()OVER(ORDERBYcolumn_......
  • 添加FReLU激活函数 在YOLOv7中修改
    1.找到yolov7的utils中的activation.py,在最后面输入以下代码#原理:对局部卷积后的输出与原始数据进行一个max的比对classFReLU(nn.Module):def__init__(self,c1,k=3):#ch_in,kernelsuper().__init__()#可分离卷积,不改变hw与channelssel......
  • 在Windows中给鼠标右键添加菜单
    我们可以通过修改注册表来给鼠标右键添加菜单,添加的位置与修改注册表的位置有关系:空白处右键(或者桌面空白处):HKEY_CLASSES_ROOT/Directory/background/shell文件夹右键:HKEY_CLASSES_ROOT/Directory/shell文件上右键:HKEY_CLASSES_ROOT/*/shell1.win+r打开窗口,输入regedit......
  • Jquery向json对象添加键值对,读取键值对,删除键值对
    添加键值对varlabelName={};labelName["Name"]="James"labelName["Sex"]="1"结果:labelName={"Name":"James","Sex":1};读取键值对vargetData={"Label":"Dong","Sex"......
  • git 用一个project添加两个远程仓库
    以android的recovery项目为例,目前gitbranch-r中只有A仓库的分支 gitbranch-r m/dev->A/branch_nameA A/master这是因为manifest中的recovery项目配置为:<remotename="A"fetch="ssh://git@git.****.cn/A/"review="gerrit.pt.A.com"/><pro......
  • ota升级包编译过程中firmware如何添加进来
    整个分析过程中,机型名以xxxx为例主要可分为一firmware如何添加进target-files.zip二编译ota升级包时如何从target-files.zip取出firmware并添加到ota升级包三如何向升级脚本updater-script中加入控制firmware升级的语句四增量升级包相比全量包不同的步骤五结论及修复方......