首页 > 其他分享 >gorm的related理解和实例

gorm的related理解和实例

时间:2024-06-17 18:25:21浏览次数:17  
标签:company db related ID 实例 user Debug gorm

package main

import (
	"fmt"

	_ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
)

var (
	dev_db   = "aplum:plum2016@tcp(localhost:3306)/aplum?charset=utf8"
	local_db = "root:123456@tcp(localhost:3306)/test?charset=utf8"
)

type MyUser struct {
	ID   int `gorm:"TYPE:int(11);NOT NULL;PRIMARY_KEY;INDEX"`
	Name string
}

type MyProfile struct {
	ID        int `gorm:"TYPE:int(11);NOT NULL;PRIMARY_KEY;INDEX"`
	Name      string
	User      MyUser `gorm:"foreignkey:UserRefer"`
	UserRefer uint
}

func main() {
	db, err := gorm.Open("mysql", local_db)
	db.LogMode(true)

	if err != nil {
		panic(err)
	}
	defer db.Close()
	related(db)
}

func setData(db *gorm.DB) {
	db.Debug().AutoMigrate(&MyUser{})
	db.Debug().AutoMigrate(&MyProfile{})
	db.Debug().Create(&MyUser{ID: 1, Name: "uname1"})
	db.Debug().Create(&MyUser{ID: 2, Name: "uname2"})
	db.Debug().Create(&MyProfile{ID: 11, Name: "pname2", UserRefer: 1})
	db.Debug().Create(&MyProfile{ID: 22, Name: "pname2", UserRefer: 2})
}

func related(db *gorm.DB) {
	var profile MyProfile
	db.Debug().First(&profile)
	fmt.Println(fmt.Sprintf("%+v", profile))
	db.Model(&profile).Related(&profile.User, "UserRefer")
	fmt.Println(fmt.Sprintf("%+v", profile))
}

gorm的tag foreignkey就是图中的 foreignkey,
tag ASSOCIATION_FOREIGNKEY 就是图中的references。

定义外健约束的2个关键字,翻译到gorm的用法就是gorm:"FOREIGNKEY:UserId;ASSOCIATION_FOREIGNKEY:ID"

  分类: 框架原理和源码    

有如下结构:

type User struct {
    gorm.Model
    Name string
    Company []Company
}

type Company struct {
    gorm.Model
    Job    string
    User   User
    UserID int
}


    var user User
    var company []Company

    user.ID = 1

    db.Model(&user).Related(&company)
    db.Model(&user).Association("company").Find(&company)

使用Related和Association都可以查询出来关联的company的数据.那他们的差异是什么呢?### 题目描述

ormgo   阅读 9.1k     1 个回答 得票最新 头像 pardon110 556259   发布于
2019-12-03
  更新于
2019-12-03

二者区别在于谁主谁从
下述代码中user表是源,company关联源中的字段名,简而言之通过先查user-->commpany 最终的主表记录从user出发

    db.Model(&user).Association("company").Find(&company)

而Related方法其内的company表是要查主表源,主查company表user实例只是条件填充对象

db.Model(&user).Related(&company)
//// SELECT * FROM company WHERE user_id = 1; // 1 is user's primary key

开启sql打印一目了然

// 启用Logger,显示详细日志
db.LogMode(true)

标签:company,db,related,ID,实例,user,Debug,gorm
From: https://www.cnblogs.com/cheyunhua/p/18252953

相关文章

  • GORM 关联查询
    GORM关联查询jouyouyun · 2018-12-0511:34:43 ·4736次点击· 预计阅读时间2分钟 · 4分钟之前 开始浏览  这是一个创建于 2018-12-0511:34:43 的文章,其中的信息可能已经有所发展或是发生改变。第一次,站长亲自招Gopher了>>>定义了一个 User 和......
  • Redis单实例安装
    Redis单实例安装Redis(RemoteDictionaryServer)是一个开源的内存数据库,遵守BSD协议,它提供了一个高性能的键值(key-value)存储系统,常用于缓存、消息队列、会话存储等应用场景。性能极高:Redis以其极高的性能而著称,能够支持每秒数十万次的读写操作24。这使得Redis成为处理高并发......
  • 学会python——读取大文本文件(python实例六)
    目录1、认识Python2、环境与工具2.1python环境2.2VisualStudioCode编译3、读取大文本文件3.1代码构思3.2代码示例3.3运行结果4、总结1、认识PythonPython是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python的设计具有很强的可读......
  • Spark Shuffle原理与代码实例讲解
    SparkShuffle原理与代码实例讲解1.背景介绍在大数据处理领域,ApacheSpark作为一种快速、通用的大规模数据处理引擎,已经成为事实上的标准。Spark能够高效地运行在Hadoop集群或独立的集群环境中,支持多种编程语言,提供了丰富的高级API,涵盖了批处理、交互式查询、实时流......
  • Spark RDD弹性分布式数据集原理与代码实例讲解
    SparkRDD弹性分布式数据集原理与代码实例讲解1.背景介绍在大数据处理领域,ApacheSpark已成为最受欢迎的框架之一。其核心组件之一是弹性分布式数据集(ResilientDistributedDataset,简称RDD)。RDD是Spark的基础抽象,提供了对大规模数据集的容错和并行处理能力。本文将......
  • Spring中Bean的实例化过程
    AbstractAutowireCapableBeanFactory.doCreateBean方法一、调用createBeanInstance方法中会获取容器中所有的BeanPostProcessor对象,并进行循环筛选出来自于SmartInstantiationAwareBeanPostProcessor接口的实现类,并调用实现类的determineCandidateConstructors方法获取到有@......
  • (必读pdf)SQL经典实例(第2版) ([美] 安东尼 • 莫利纳罗 [澳] 罗伯特 • 德 • 格拉夫 [格
    书:pan.baidu.com/s/1tIHXj9HmIYojAHqje09DTA?pwd=jqso提取码:jqsoSQL基础与高级特性:概述SQL的基本语法和常用操作,并介绍一些高级特性,如窗口函数、递归查询等。统计分析应用:展示如何使用SQL进行统计分析,包括数据的汇总、分组、排序以及趋势分析等。报表制作技巧:介绍如何使用SQL......
  • Java学习 - MySQL数据库中 变量 和 流程控制 实例
    变量变量分类系统变量全局变量:对于服务器所有的连接有效会话变量:只在当前连接有效自定义变量用户变量:只在当前连接有效局部变量:仅在BEGIN-END中有效系统变量查看所有的系统变量SHOWGLOBAL|SESSIONVARIABLES;查看某些的系统变量SHOWGLOBAL|SESSION......
  • python学习 - 对目录操作和对文件操作的 实例代码
    #!/usr/bin/python#-*-coding:UTF-8-*-importosimportos,shutilclassOperatingFile:defcreatFile(self,path):f=file(path,"w+")f.close()defreadFile(self,path):#方法一f=open("E:/aa......
  • python学习 - 对list列表的操作 实例代码
    #!/usr/bin/evnpython#-*-encoding:utf-8-*-list=[1,4,3,3,"A","B","c","A"]#增加list.append("AA")#像末尾增加一个新元素list.insert(1,"B")#像指定索引位置插入元素list.extend(["D","DD"])#新......