本节内容,我们将mysql引入我们的框架 (本地mysql部署可参考 Mysql集群部署(主从复制)。
第一步 引入mysql相关服务
go get -u gorm.io/gorm go get -u gorm.io/driver/mysql go get -u github.com/go-sql-driver/mysql
第二步 创建测试库表
create database fusheng_admin; create table `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', `username` varchar(100) NOT NULL DEFAULT "" COMMENT '名称', `password` varchar(100) NOT NULL DEFAULT "" COMMENT '密码', `email` varchar(100) NOT NULL DEFAULT "" COMMENT '邮箱', `update_at` int(10) NOT NULL DEFAULT 0 COMMENT '更新时间', `create_at` int(10) NOT NULL DEFAULT 0 COMMENT '创建时间', PRIMARY KEY ( `id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
第三部 对mysql进行封装
mkdir ./library/database
创建./library/database/mysql.go :
package database
import (
"fmt"
"github.com/gin-gonic/gin"
_ "github.com/go-sql-driver/mysql"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"time"
)
type MysqlConf struct {
Service string `yaml:"service"`
DataBase string `yaml:"database"`
Addr string `yaml:"addr"`
User string `yaml:"user"`
Password string `yaml:"password"`
MaxIdleConns int `yaml:"maxIdleConns"`
MaxOpenConns int `yaml:"maxOpenConns"`
ConnTimeout time.Duration `yaml:"connTimeout"`
ReadTimeout time.Duration `yaml:"readTimeout"`
WriteTimeout time.Duration `yaml:"writeTimeout"`
ConnMaxLifeTime time.Duration `yaml:"ConnMaxLifeTime"`
}
var MysqlAllClients map[string]*gorm.DB
func InitMysqlClient(conf *MysqlConf) (client *gorm.DB, err error) {
dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?timeout=%s&readTimeout=%s&writeTimeout=%s&parseTime=True&loc=Asia%%2FShanghai",
conf.User,
conf.Password,
conf.Addr,
conf.DataBase,
conf.ConnTimeout,
conf.ReadTimeout,
conf.WriteTimeout)
client, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
return client, err
}
db, err := client.DB()
if err != nil {
return client, err
}
db.SetMaxOpenConns(conf.MaxOpenConns)
db.SetMaxIdleConns(conf.MaxIdleConns)
db.SetConnMaxLifetime(conf.ConnMaxLifeTime)
return client, nil
}
type DB struct {
Name string
Ctx *gin.Context
}
func (d *DB) GetConn() *gorm.DB {
return MysqlAllClients[d.Name]
}
func NewDb(ctx *gin.Context, name string) DB {
return DB{
Name: name,
Ctx: ctx,
}
}
第四步 增加mysql配置与读取
./conf/config.yaml, 新增
mysql:
fusheng_admin:
database: fusheng_admin
addr: 10.252.187.163:3306
user: root
password: 123456
connTimeout: 300ms
readTimeOut: 500ms
writeTimeOut: 500ms
MaxIdleConns: 10
MaxOpenConns: 10
ConnMaxLifeTime: 3m
./conf/config.go:
package conf
import (
"fusheng-admin/library/cache"
"fusheng-admin/library/database"
"gopkg.in/yaml.v3"
"io/ioutil"
)
var BaseConf Config
var ConfigFile = "./conf/config.yaml"
type LogConf struct {
Dir string `yaml:"dir"`
}
type Config struct {
Log LogConf `yaml:"log"`
Redis *cache.RedisConf `yaml:"redis"`
Mysql map[string]*database.MysqlConf `yaml:"mysql"`
}
func InitConf() {
if yamlFile, err := ioutil.ReadFile(ConfigFile); err != nil {
panic("read conf error: " + err.Error())
} else if err = yaml.Unmarshal(yamlFile, &BaseConf); err != nil {
panic("conf file unmarshal error: " + err.Error())
}
}
第五步 mysql初始化
创建文件./helpers/mysql.go:
package helpers
import (
"fusheng-admin/conf"
"fusheng-admin/library/database"
"gorm.io/gorm"
)
func InitMysql() {
database.MysqlAllClients = make(map[string]*gorm.DB)
for service, dbConf := range conf.BaseConf.Mysql {
if client, err := database.InitMysqlClient(dbConf); err != nil {
panic("mysql connect " + service + " error :%s" + err.Error())
} else {
database.MysqlAllClients[service] = client
}
}
}
第六步 main函数中调用
./main.go :
package main
import (
"fusheng-admin/conf"
"fusheng-admin/helpers"
"fusheng-admin/library/middleware"
"fusheng-admin/router"
"github.com/gin-gonic/gin"
)
func main() {
// 1.创建路由
r := gin.Default()
r.Use(middleware.LoggerToFile())
// 初始化配置
conf.InitConf()
helpers.InitMysql()
helpers.InitRedis()
// 2.绑定路由规则,执行的函数
// gin.Context,封装了request和response
router.Http(r)
// 3.监听端口,默认在8080
// Run("里面不指定端口号默认为8088")
r.Run(":8088")
}
至此,我们项目就已经支持mysql使用啦~,下一章我们再介绍mysql在项目中的具体使用


