热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

go协程模型

本文主要分享【go协程模型】,技术文章【【GORM】模型关系-HasOne】为【VivaPython】投稿,如果你遇到GoWeb相关问题,本文相关知识或能到你。go协程模型一、概述HasO

本文主要分享【go协程模型】,技术文章【【GORM】模型关系-HasOne】为【Viva Python】投稿,如果你遇到Go Web相关问题,本文相关知识或能到你。

go协程模型

一、概述 HasOne与另外一个模型建立一对一的关联,这种关联表明一个模型的每个实例都包含或拥有另一个模型实例。 二、模型建立

实现HasOne模型,拥有者需要定义被拥有者的模型变量(关联模型变量),并在模型变量中指定:

(1) 外键:在被拥有者模型中定义,在关联模型变量中标注。默认为拥有者模型名ID,需要在关联模型中显式定义

(2) 引用:在拥有者模型中定义,类型要与外键变量的类型一致,在关联模型变量中标注,默认为关联模型的主键。

以用户User拥有CreditCard为例,模型定义如下:

(1) CreditCard为关联模型变量,外键默认为CreditCard模型的UserID,引用为User模型的ID

// 拥有者模型。
type User struct {
   
   ID         uint `gorm:"primary_key"`  // 默认的引用
   Password   string     `gorm:"->:false;<-"`
   CreditCard CreditCard  // 关联模型变量。
}

// 关联模型。
type CreditCard struct {
   
   ID       uint   `gorm:"primary_key"`
   UserID 	uint  // 默认的外键,需要显式定义。
   Number   string `gorm:"type:varchar(20)"`
}

(2) 建表之后,在CredictCard表中,会新增一个字段user_id,表示该CreditCard记录与之关联的User主键。

User表字段描述

user表字段描述

CreditCard表字段描述

go协程模型

三、重定义 1. 重定义外键 重定义外键,即在关联模型中指向引用的字段,需要在关联模型变量中标注。如下重定义 UserRefer为外键,使用 foreignKey标注关联模型变量 CreditCard
type User struct {
   
	ID         uint `gorm:"primary_key"`
	Name       string
	Password   string     `gorm:"->:false;<-"`
	CreditCard CreditCard `gorm:"foreignKey:UserRefer"`
}

type CreditCard struct {
   
	ID        uint `gorm:"primary_key"`
	UserRefer uint
	Number    string `gorm:"type:varchar(20)"`
}
2. 重定义引用 重定义引用,即外键指向的标识,需要在关联模型变量中标注。如下重定义 Name为引用。
type User struct {
   
   ID         uint `gorm:"primary_key"`
   Name       string
   Password   string     `gorm:"->:false;<-"`
   CreditCard CreditCard `gorm:"foreignKey:UserName;references:Name"`
}

type CreditCard struct {
   
   ID       uint `gorm:"primary_key"`
   UserName string
   Number   string `gorm:"type:varchar(20)"`
}
四、相关操作 下列的操作基于以下的 HasOne关联模型
type User struct {
   
   ID         uint `gorm:"primary_key"`
   Name       string
   Password   string     `gorm:"->:false;<-"`
   CreditCard CreditCard `gorm:"foreignKey:UserName;references:Name"`
}

type CreditCard struct {
   
   ID       uint `gorm:"primary_key"`
   UserName string
   Number   string `gorm:"type:varchar(20)"`
}
1. 保存 声明完整的结构体变量,调用 Save方法进行保存。
func TestSaveUser() {
   
   user := User{
   
      Name:     "Jason",
      Password: "12345",
      CreditCard: CreditCard{
   
         Number: "1234567890",
      },
   }
   err := SaveUser(user)
   if err != nil {
   
      log.Println("用户保存失败!")
   } else {
   
      log.Println("用户保存成功!")
   }
}
func SaveUser(user User) error {
   
   err := db.Save(&user).Error
   return err
}
2. 删除 删除实例有两种策略:

​ (1) 连同HasOne关联的对象记录删除,如上删除用户后连同账号记录一同删除。采用Select方法。如下,使用Select方法选择关联的模型,连同模型记录一同删除。

func DeleteUserByName(name string) error {
   
   var user User
   var err error
   db.Model(&user).Where("name = ?", name).First(&user)
   err = db.Model(&user).Select("CreditCard").Delete(&user).Error
   return err
}

​ (2) 不删除关联的模型记录,与(1)类型,不使用Select方法。

3. 查询

在查询时需要加载关联模型,使用Preload方法加载。

func GetUserByName(name string) (User, error) {
   
   var user User
   err := db.Model(&user).Preload("CreditCard").Where("name = ?", name).First(&user).Error
   return user, err
}

本文《【GORM】模型关系-HasOne》版权归Viva Python所有,引用【GORM】模型关系-HasOne需遵循CC 4.0 BY-SA版权协议。


推荐阅读
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
  • 在Django中提交表单时遇到值错误问题如何解决?
    在Django项目中,当用户提交包含多个选择目标的表单时,可能会遇到值错误问题。本文将探讨如何通过优化表单处理逻辑和验证机制来有效解决这一问题,确保表单数据的准确性和完整性。 ... [详细]
  • 数据库多表联合查询:内连接与外连接详解
    在数据库的多表查询中,内连接和外连接是两种常用的技术手段。内连接用于检索多个表中相互匹配的记录,即只有当两个表中的记录满足特定的连接条件时,这些记录才会被包含在查询结果中。相比之下,外连接则不仅返回匹配的记录,还可以选择性地返回不匹配的记录,具体取决于左外连接、右外连接或全外连接的选择。本文将详细解析这两种连接方式的使用场景及其语法结构,帮助读者更好地理解和应用多表查询技术。 ... [详细]
  • 提升Android开发效率:Clean Code的最佳实践与应用
    在Android开发中,提高代码质量和开发效率是至关重要的。本文介绍了如何通过Clean Code的最佳实践来优化Android应用的开发流程。以SQLite数据库操作为例,详细探讨了如何编写高效、可维护的SQL查询语句,并将其结果封装为Java对象。通过遵循这些最佳实践,开发者可以显著提升代码的可读性和可维护性,从而加快开发速度并减少错误。 ... [详细]
  • 单链表的高效遍历及性能优化策略
    本文探讨了单链表的高效遍历方法及其性能优化策略。在单链表的数据结构中,插入操作的时间复杂度为O(n),而遍历操作的时间复杂度为O(n^2)。通过在 `LinkList.h` 和 `main.cpp` 文件中对单链表进行封装,我们实现了创建和销毁功能的优化,提高了单链表的使用效率。此外,文章还介绍了几种常见的优化技术,如缓存节点指针和批量处理,以进一步提升遍历性能。 ... [详细]
  • 在洛谷 P1344 的坏牛奶追踪问题中,第一问要求计算最小割,而第二问则需要找到割边数量最少的最小割。通过为每条边附加一个单位权值,可以在求解最小割时优先选择边数较少的方案,从而同时解决两个问题。这种策略不仅简化了问题的求解过程,还确保了结果的最优性。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 如何精通编程语言:全面指南与实用技巧
    如何精通编程语言:全面指南与实用技巧 ... [详细]
  • 本文探讨了如何利用 jQuery 的 JSONP 技术实现跨域调用外部 Web 服务。通过详细解析 JSONP 的工作原理及其在 jQuery 中的应用,本文提供了实用的代码示例和最佳实践,帮助开发者解决跨域请求中的常见问题。 ... [详细]
  • SSAS入门指南:基础知识与核心概念解析
    ### SSAS入门指南:基础知识与核心概念解析Analysis Services 是一种专为决策支持和商业智能(BI)解决方案设计的数据引擎。该引擎能够为报告和客户端应用提供高效的分析数据,并支持在多维数据模型中构建高性能的分析应用。通过其强大的数据处理能力和灵活的数据建模功能,Analysis Services 成为了现代 BI 系统的重要组成部分。 ... [详细]
  • 本文探讨了如何有效地构建和优化微信公众平台账号,涵盖了用户信息管理、内容创作与发布、互动策略及数据分析等方面。通过合理设置用户信息字段,如用户名、昵称、密码、真实姓名和性别等,确保账号的安全性和用户体验。同时,文章还介绍了如何利用微信公众平台的各项功能,提升用户参与度和品牌影响力。 ... [详细]
  • 深入解析 Golang 中 Context 的功能与应用
    本文详细探讨了 Golang 中 Context 的核心功能及其应用场景,通过深入解析其工作机制,帮助读者更好地理解和运用这一重要特性,对于提升代码质量和项目开发效率具有重要的参考价值。 ... [详细]
  • 哈希表(Hash Table)是一种高效的查找算法,与传统的链表和树结构相比,其在查找过程中无需进行逐个元素的比较。本文将深入探讨哈希表的基本原理、应用场景以及优化策略,帮助读者全面理解其在实际开发中的优势和局限性。通过实例分析和代码示例,我们将展示如何有效利用哈希表提高数据处理效率,并解决常见的冲突问题。 ... [详细]
  • 按照之前我对map的理解,map中的数据应该是有序二叉树的存储顺序,正常的遍历也应该是有序的遍历和输出,但实际试了一下,却发现并非如此,网上查了下,发现从Go1开始,遍历的起始节点就是随机了,当然随机 ... [详细]
author-avatar
丝兰郁香
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有