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

77 阅读2分钟

导读

本套笔记是学习完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,使开发人员能够轻松地与数据库进行交互

Has One

has one 与另一个模型建立一对一的关联,但它和一对一关系有些许不同。 这种关联表明一个模型的每个实例都包含或拥有另一个模型的一个实例。

例如银行卡

// User 有一张 CreditCard,UserID 是外键
type User struct {
  gorm.Model
  CreditCard CreditCard
}

type CreditCard struct {
  gorm.Model
  Number string
  UserID uint
}

检索

type User struct {
	ID         uint
	Name       string
	CreditCard CreditCard
}

type CreditCard struct {
	ID     uint
	Number string
	UserID uint
}

func GetAll(db *gorm.DB) ([]User, error) {
	var users []User
	err := db.Preload("CreditCard").Find(&users).Error
	return users, err
}

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{}) //连接数据库

	users, err := GetAll(db)
	if err != nil {
		log.Fatal(err)
	}

	for _, user := range users {
		fmt.Printf("User %d: %s\n", user.ID, user.Name)
		if user.CreditCard.ID != 0 {
			fmt.Printf("  Credit Card: %s\n", user.CreditCard.Number)
		} else {
			fmt.Println("  No Credit Card found")
		}
	}
}

UserCreditCard 是两个模型,它们之间存在一对一的关联关系。User 模型包含一个名为 CreditCard 的字段,用于存储关联的信用卡信息。

GetAll 函数使用 Preload 方法来预加载关联的信用卡信息,并使用 Find 方法检索所有用户及其关联的信用卡。最后,将得到的用户列表打印出来

重写外键和重写引用

方法与Belongs to的一样

外键约束

方法与Belongs to的一样