go+mysql+pool_结合 gin+gorm+go-Redis 写一个基础 API(上篇)

初始化

新建目录,初始化项目,运行:

go mod init sai0556/gin-frame

// 使用本地module

go mod edit -require=local.com/sai0556/[email protected]

go mod edit -replace=local.com/sai0556/[email protected]=$PWD

编码

配置部分

新建config目录,初始化并监听文件:

package config

import (

"fmt"

"github.com/fsnotify/fsnotify"

"github.com/spf13/viper"

)

type Config struct {

Name string

}

// 初始化配置

func Init(cfg string) error {

c := Config{

Name: cfg,

}

if err := c.initConfig(); err != nil {

return err

}

c.watchConfig()

return nil

}

func (c *Config) initConfig() error {

if c.Name != "" {

viper.SetConfigFile(c.Name)

} else {

// 默认配置文件是conf/config.yaml

viper.AddConfigPath("conf")

viper.SetConfigName("config")

}

viper.SetConfigType("yaml")

// viper解析配置文件

err := viper.ReadInConfig()

if err != nil {

panic(fmt.Errorf("Fatal error config file: %s \n", err))

}

fmt.Println(viper.GetString("name"))

return nil

}

func (c *Config) watchConfig() {

viper.WatchConfig()

viper.OnConfigChange(func(e fsnotify.Event) {

fmt.Println("Config file changed:", e.Name)

})

}

conf/config.yaml,语法可自行研究下,比较简单。

YAML入门

name: gin-frame

db:

name: blog

host: 127.0.0.1:3306

username: root

password: 111111

charset: utf8mb4

数据库gorm

连接数据库,构建连接池:

package model

import (

"fmt"

"sync"

"errors"

orm "github.com/jinzhu/gorm"

_ "github.com/jinzhu/gorm/dialects/mysql"

"github.com/spf13/viper"

)

type MySqlPool struct {}

var instance *MySqlPool

var once sync.Once

var db *orm.DB

var err error

// 单例模式

func GetInstance() *MySqlPool {

once.Do(func() {

instance = &MySqlPool{}

})

return instance

}

func (pool *MySqlPool) InitPool() (isSuc bool) {

dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=%s", viper.GetString("db.username"), viper.GetString("db.password"), viper.GetString("db.host"), viper.GetString("db.name"), viper.GetString("db.charset"))

db, err = orm.Open("mysql", dsn)

if err != nil {

panic(errors.New("mysql连接失败"))

return false

}

// 连接数配置也可以写入配置,在此读取

db.DB().SetMaxIdleConns(50)

db.DB().SetMaxOpenConns(50)

// db.LogMode(true)

return true

}

main.go

我们完善一下main.go,初始化配置,并构建连接池:

package main

// import 这里我习惯把官方库,开源库,本地module依次列出

import (

"log"

"os"

"errors"

"github.com/spf13/pflag"

"local.com/sai0556/gin-frame/config"

"local.com/sai0556/gin-frame/model"

)

var (

conf = pflag.StringP("config", "c", "", "config filepath")

)

func main() {

pflag.Parse()

// 初始化配置

if err := config.Init(*conf); err != nil {

panic(err)

}

// 连接mysql数据库

isSuc := model.GetInstance().InitPool()

if !isSuc {

log.Println("init database pool failure...")

panic(errors.New("init database pool failure"))

}

}

写完不妨运行一下,看看效果吧!

go run main.go -c=./conf/config.yaml

参考:掘金小册​juejin.im

你可能感兴趣的:(go+mysql+pool)