gin引入viper、gorm(教程part2)

前言

我是程序员无思。这是创作gin + vue 零基础入门的教程(part2),这个教程的前后端源码我将同步更新至我的gitee账号:https://gitee.com/coderwusi 、github账号:https://github.com/coderwusi

新建项目根目录文件夹gin-base-cli ,在根目录文件夹下新建 main.go,内容如下:

package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}

使用go的包管理工具go modules ,在cmd下输入以下内容初始化:

go mod init gin-base-cli

输入 以下内容更新依赖

go mod tidy

插曲:go modules 与 go path

gopath的设置通过设置变量名为GOPATH,变量值为文件夹目录

gin引入viper、gorm(教程part2)

使用 go mod tidy 命令进行依赖整理时,新增加的包会出现在gopath的路径下

gin引入viper、gorm(教程part2)

注意事项

  1. 使用 go mod 相关命令只会整理你的项目依赖,但你下载的包并不会丢失。
  2. 一台机器上所有项目的依赖都会在gopath目录下,gopath目录的占用空间随着时间可能越来越多,所以最好不要放系统盘里。

回到正题

在项目根目录下执行

go run main.go

程序编译完后访问

http://localhost:8080/ping

显示如下,则表示gin引入成功

gin引入viper、gorm(教程part2)

引入viper

在根目录新建config.yaml文件

mysql:
  host: "127.0.0.1"
  port: 3306
  suffix: "charset=utf8mb4&parseTime=True&loc=Local" #后缀
  dbname: "wusidb"
  username: "root"
  password: "123456"
  max_open_conns: 200
  max_idle_conns: 50

新建名为setting的文件夹,在setting文件夹下新建init.go:

package setting

import (
	"fmt"
	"github.com/spf13/viper" //第三方配置管理神器
)

var Conf = new(TotalConfig)

type TotalConfig struct {
	*MySQLConfig `mapstructure:"mysql"`
}



type MySQLConfig struct {
	Host         string `mapstructure:"host"`
	Username     string `mapstructure:"username"`
	Password     string `mapstructure:"password"`
	Dbname       string `mapstructure:"dbname"`
	Suffix       string `mapstructure:"suffix"`
	Port         int    `mapstructure:"port"`
	MaxOpenConns int    `mapstructure:"max_open_conns"`
	MaxIdleConns int    `mapstructure:"max_idle_conns"`
}


func init() () {
	viper.SetConfigFile("config.yaml")
	//viper.AddConfigPath("./")

	if err := viper.ReadInConfig(); err != nil {
		fmt.Printf("viper.ReadInConfig failed, err:%v\n", err)
		return
	}

	if err := viper.Unmarshal(Conf); err != nil {
		fmt.Printf("viper.Unmarshal failed, err:%v\n", err)
	}
	fmt.Println(Conf.MySQLConfig)

}

在main.go 中导入setting :

package main

import (
	_ "gin-base-cli/setting"  //导入setting.init 完成初始化
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}

执行命令整理依赖

go mod tidy

执行 go run main.go启动程序

gin引入viper、gorm(教程part2)

如上图所示,若打印出config.yaml中的文件,则表示第三方配置库viper引入成功。

当前目录结构如下:

在这里插入图片描述

引入Gorm

Gorm 是非常好的orm框架,可以大大加快我们编写sql语句的效率

根目录下新建model文件夹,在model文件夹下新建init.go:

package model

import (
   "fmt"
   "gin-base-cli/setting"
   "gorm.io/driver/mysql"
   "gorm.io/gorm"
   "gorm.io/gorm/schema"
)
// DB 数据库链接单例

var DB *gorm.DB


func MysqlInit(config *setting.MySQLConfig) () {
   var err error
   dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?%s", config.Username, config.Password, config.Host, config.Port, config.Dbname, config.Suffix)
   DB, err = gorm.Open(mysql.New(mysql.Config{
      DSN:                       dsn,   // 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{NamingStrategy: schema.NamingStrategy{SingularTable: true}})
   if err != nil {
      fmt.Println("数据库连接错误:", err)
      return
   }

   if err := DB.AutoMigrate(); err != nil {
      fmt.Println("数据库迁移错误:", err)
      return
   }

   fmt.Println("success")
}

修改main.go:

package main

import (
   "gin-base-cli/model"
   "gin-base-cli/setting"
   "github.com/gin-gonic/gin"
)

func main() {

   setting.Init()
   model.MysqlInit(setting.Conf.MySQLConfig)
   r := gin.Default()
   r.GET("/ping", func(c *gin.Context) {
      c.JSON(200, gin.H{
         "message": "pong",
      })
   })
   r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}

go run main.go 命令启动程序,若打印出如下信息则表示gorm引入成功:

gin引入viper、gorm(教程part2)

阶段总结

至此,环境变量的读取,mysql数据库的连接告一段落了。目前目录结构如下:

gin引入viper、gorm(教程part2)

我是程序员无思,喜欢这个系列的文章就点赞支持一下吧!

上一篇:kratos微服务框架使用nacos作为远端配置中心


下一篇:基于gin框架的较为通用的web脚手架---CLD分层理念