go+viper读取yaml配置文件

创建conf/config.yaml

db:
    Database: mysql
    Port: 3306
    UserName:
    Password:
    Host: 127.0.0.1
    Charset: utf8

创建common/config.go

package common

import (
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
	"go-server/models"
	"log"
)

//映射配置结构体
type Config struct {
	DB models.DBConfig
}
var Conf = &Config{}

func InitConfig(configPath string) *Config {
	//设置配置文件得格式
	viper.SetConfigType("yaml")
	viper.SetConfigFile(configPath)

	err := viper.ReadInConfig();
	if err != nil {
		log.Print("配置文件获取异常", err)
	}
	err = viper.Unmarshal(&Conf)
	if err != nil {
		log.Print("配置文件获取异常", err)
	}
	viper.WatchConfig()
	viper.OnConfigChange(func(in fsnotify.Event) {
		err = viper.Unmarshal(&Conf)
		if err != nil {
			log.Print("配置文件获取异常", err)
		}
	})
	return Conf
}

创建common/db.go

package common

import (
	"fmt"
	"go-server/models"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
	"log"
)

var DB *gorm.DB

func InitDB() *gorm.DB {
	host := Conf.DB.Host
	port := Conf.DB.Port
	username := Conf.DB.Username
	password := Conf.DB.Password
	database := Conf.DB.Database
	charset := Conf.DB.Charset
	args := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=true",
		username,
		password,
		host,
		port,
		database,
		charset)
	db, err := gorm.Open(mysql.Open(args),&gorm.Config{
		//解决建表时表名自动带复数,如record变成records
		NamingStrategy: schema.NamingStrategy{SingularTable: true},
		//打印原生sql日志
		//Logger: logger.Default.LogMode(logger.Info),
	})
	//设置数据库自动创建表字段()
	//AutoMigrate自动根据结构体创建表结构,结构体名称即表名
	db.Set("gorm:table_options", "CHARSET=utf8").AutoMigrate(&models.Tabledata{})
	if err != nil {
		log.Print("连接数据库失败" + err.Error())
	}

	DB = db
	return db
}

func GetDB() *gorm.DB {
	return DB
}

调用配置初始化数据库

func init() {
	//读取yaml中得配置信息
	common.InitConfig("conf/config.yaml")
	//初始化数据库连接
	common.InitDB()
	db := common.GetDB()
	
	sqlDB, err := db.DB()
	if err != nil {
		log.Print("database execption", err)
		return
	}
	//设置空闲连接池中连接得最大数量
	sqlDB.SetMaxIdleConns(10)
	//设置打开数据库连接的最大数量
	sqlDB.SetMaxOpenConns(100)
	//设置连接可复用的最大时间
	sqlDB.SetConnMaxLifetime(1 * time.Hour)
}

创建routers/router.go

package routers

import (
	"github.com/gin-gonic/gin"
	"github.com/gin-contrib/cors"
	"go-server/api"
	"time"
)

func Start() {
	e:= gin.Default()
	//跨域访问(请求外部资源)
	mwCORS := cors.New(cors.Config{
		//准许跨域请求网站,多个使用,分开,限制使用
		AllowOrigins: []string{"*"},
		//允许跨域得远点网站,可以直接retrun true就可以了
		AllowOriginFunc: func(origin string) bool {
			return true
		},
		//准许使用得请求方式
		AllowMethods: []string{"PUT", "PATCH", "POST", "DELETE", "GET"},
		//准许使用的请求头
		AllowHeaders: []string{"Origin", "Authorization", "Content-Type"},
		//凭证共享,确定共享
		AllowCredentials: true,
		//显示得请求头
		ExposeHeaders: []string{"Content-Type"},
		//超时设定
		MaxAge: time.Hour * 24,
		//AllowWildcard:          false,
		//AllowBrowserExtensions: false,
		//AllowWebSockets:        false,
		//AllowFiles:             false,
		//AllowAllOrigins:        false,

	})
	e.Use(mwCORS)
	e.POST("/add",api.Add)
	e.DELETE("/delete",api.Del)
	e.PUT("/update",api.Update)
	e.GET("/list",api.ListAll)
	e.GET("/listpart",api.ListPart)
	e.Run()
}

main.go

func main() {
	routers.Start()
}

你可能感兴趣的:(go编程,数据库,golang,数据库,mysql)