从零开始搭建go项目(gin框架)(五) – 支持Mysql

本节内容,我们将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在项目中的具体使用

参考链接

https://gorm.io/

易享写作 - 专业在线小说创作工具

🚀 易享写作 - 专业在线小说创作工具

欢迎使用 易享写作 (MakeANovel) —— 一款专为小说创作者设计的在线平台。无论您是网文作家、文学爱好者还是故事创作者,这里都能提供您所需的强大工具。

  • 人物关系图生成器:可视化梳理复杂角色关系,创作更轻松。
  • 在线创作与保存:实时保存,多设备同步,灵感永不丢失。
  • 作品系统管理:清晰管理您的所有小说项目和章节。
  • 便捷分享与反馈:方便获取读者意见,助力作品完善。
易享写作 - 专业在线小说创作工具

🚀 易享写作 - 专业在线小说创作工具

欢迎使用 易享写作 (MakeANovel) —— 一款专为小说创作者设计的在线平台。无论您是网文作家、文学爱好者还是故事创作者,这里都能提供您所需的强大工具。

  • 人物关系图生成器:可视化梳理复杂角色关系,创作更轻松。
  • 在线创作与保存:实时保存,多设备同步,灵感永不丢失。
  • 作品系统管理:清晰管理您的所有小说项目和章节。
  • 便捷分享与反馈:方便获取读者意见,助力作品完善。

0 评论
最新
最旧 最多投票
内联反馈
查看所有评论
欠揍么 · 每日毒舌指南 · 广告(含跳转)
👊

欠揍么

毒舌·解压 · iOS 17.0+

¥8.00 挨一次
⚡ 今天你 欠揍 了吗? ⚡
温柔😇
凶残👿
炼狱🔥
“每天被骂一次,
证明你还活着。”
#扎心真相 #欲罢不能
🗓️

每日毒舌

3种强度·犀利文案

📆

打卡系统

记录挨骂历程

🏆

战绩炫耀

生成挨骂海报

📜

历史记录

回顾成长(痛)

69
连续挨骂
👊

恭喜!你已经坚持被骂69天

腹黑次数: 1,024 · 击败99%欠扁用户
⬇️ 分享海报 拉朋友下水
🍎 App Store 立即欠揍
“脏话·粗俗幽默·成人主题” · 每日一骂,释放压力。
无广告 · 暗黑界面 · 智能推荐
滚动至顶部