「这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战」

前言

上篇启动了基础的Gin框架丛林到实现一个接口功能,今天来简单使用一下GROM

什么是ORM

英文单词使Object-Relationl Mapping,对象 关系 映射,Relationl指的是关系型数据库,最常见的关系型数据库就是Mysql,这篇就会拿Mysql做一个实验,ORM封装数据库访问细节,用代码把数据库表示成对象表达出来,ORM封装了数据库操作,让开发者对数据对象进行操作,不用关心底层数据库原理,写增删改查的时间就会减少工作量,但是复杂的语句我们还是会使用原生语句,更容易理解和维护,所以现在非常流行使用ORM。

安装Gorm

在项目根目录安装两个第三方依赖包下使用命令:

go mod get  github.com/jinzhu/gorm
go  get github.com/jinzhu/gorm/dialects/mysql
复制代码
实现功能

实现说一下实现的功能,在代码下面说一下要点吧

主要完成了数据库结构的自动迁移,一个接口查询所有的分类,所有分类下面所有的网址,也就是ORM列表数据:

image.png

代码

为了展示方便,写在了一个文件中,所以有点长,但是实现了基本功能,能用就行,哈哈~后期有精力可以把它整理一下。

package main

import (
	"fmt"

	"github.com/gin-gonic/gin"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

var db *gorm.DB

type UrlType struct {
	ID       uint `gorm:"primary_key"`
	Name     string
	UrlLists []UrlList `gorm:"FOREIGNKEY:TypeID;ASSOCIATION_FOREIGNKEY:ID"`
}

type UrlList struct {
	ID     uint `gorm:"primary_key"`
	TypeID uint // 默认外键, 用户Id
	Name   string
	URL    string
}

func init() {
	//创建一个数据库的连接
	var err error
	MyUser := "*****"
	Password := "**************"
	Host := "***.***.***.***"
	Port := 3306
	Db := "******"
	connArgs := fmt.Sprintf("%s:%s@(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", MyUser, Password, Host, Port, Db)

	db, err = gorm.Open("mysql", connArgs)
	if err != nil {
		panic(err)
	}
	db.SingularTable(true)                 //去掉数据库自动迁移数据名加的s
	db.AutoMigrate(&UrlList{}, &UrlType{}) //自动迁移
}

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	defer db.Close()
	r.GET("/index", func(c *gin.Context) {
		var list []UrlType
		db.Debug().Preload("UrlLists").Find(&list)

		c.JSON(200, gin.H{
			"message": list,
		})
	})
	r.Run()
}

复制代码
要点

引入包原理

下载了两个包。一个是gorm,一个是mysql,mysql包引入的时候前面有个下划线的意思是引入的时候不导入包的全部内容而是调用包里面的init初始化方法,gorm是直接引入,这个单文件中使用了这个包的很多方法。

GORM字段定义

FOREIGNKEYASSOCIATION_FOREIGNKEY

查询

db.Debug().Preload("UrlLists").Find(&list)
复制代码

Prelad的意思是预加载这句话的意思是先找到所有的分类数据,使用其分类分析中关联ID查询其分类下面的列表数据,可以理解为一下原生查询语句:

SELECT * FROM url_type;
SELECT * FROM url_list WHERE type_id IN (1,2,3...);
复制代码
总结

虽然比较粗糙,但是还是实现了想要的功能,下面来优化一下这个框架的细节,或者尝试用Docker部署这个简单的框架到真实运行环境中。