目录
学习笔记,写到哪是哪。
接着上一篇文章:Go语学习笔记 - 增加文件下载工具 | Web框架Gin(六)_剑客阿良_ALiang的博客-CSDN博客
我已经把暂时想到的工具类补充好了,开始数据库的连接和使用。
从这篇开始会慢慢在增加数据库的相关操作。
项目地址:github地址
首先安装一下所需要的gorm和mysql驱动。
安装指令如下:
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
修改配置文件toml_config.go,增加mysql相关配置。
具体的使用方式参考:Go语学习笔记 - 配置文件使用、日志配置 | Web框架Gin(二)_剑客阿良_ALiang的博客-CSDN博客_config.toml
toml_config.go文件调整后代码如下:
- package toml
-
- import (
- "fmt"
- "github.com/spf13/viper"
- )
-
- type TomlConfig struct {
- AppName string
- Log LogConfig
- Mysql MysqlConfig
- }
-
- // 日志保存地址
- type LogConfig struct {
- Path string
- Level string
- }
-
- // 日志保存地址
- type MysqlConfig struct {
- Host string
- User string
- Password string
- DbName string
- Port int64
- }
-
- var c TomlConfig
-
- func init() {
- // 设置文件名
- viper.SetConfigName("config")
- // 设置文件类型
- viper.SetConfigType("toml")
- // 设置文件路径,可以多个viper会根据设置顺序依次查找
- viper.AddConfigPath(".")
- viper.AutomaticEnv()
- err := viper.ReadInConfig()
- if err != nil {
- panic(fmt.Errorf("fatal error config file: %s", err))
- }
-
- viper.Unmarshal(&c)
- }
- func GetConfig() TomlConfig {
- return c
- }
可以看到增加了MysqlConfig结构体。
配置文件config.toml文件增加mysql对应配置,修改后如下:
- appName = "learn-gin"
-
- [log]
- level = "debug"
- path = "logs/learn.log"
-
- [mysql]
- host = "xx.xx.xx.xx"
- user = "root"
- password = "xxxxxx"
- dbName = "test-c"
- port = 3306
-
增加数据库连接初始化代码,mysql_init.go文件添加至config/mysql下,如下图。

mysql_init.go文件代码如下:
- package mysql
-
- import (
- "fmt"
- "gorm.io/driver/mysql"
- "gorm.io/gorm"
- "gorm.io/gorm/logger"
- "learn-gin/config/toml"
- )
-
- var _db *gorm.DB
-
- func init() {
- username := toml.GetConfig().Mysql.User //账号
- password := toml.GetConfig().Mysql.Password //密码
- host := toml.GetConfig().Mysql.Host //数据库地址,可以是Ip或者域名
- port := toml.GetConfig().Mysql.Port //数据库端口
- Dbname := toml.GetConfig().Mysql.DbName //数据库名
- timeout := "10s" //连接超时,10秒
-
- //拼接下dsn参数, dsn格式可以参考上面的语法,这里使用Sprintf动态拼接dsn参数,因为一般数据库连接参数,我们都是保存在配置文件里面,需要从配置文件加载参数,然后拼接dsn。
- dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
- var err error
-
- //连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
- _db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
- Logger: logger.Default.LogMode(logger.Info),
- })
- if err != nil {
- panic("连接数据库失败, error=" + err.Error())
- }
-
- sqlDB, _ := _db.DB()
-
- //设置数据库连接池参数
- sqlDB.SetMaxOpenConns(100) //设置数据库连接池最大连接数
- sqlDB.SetMaxIdleConns(20) //连接池最大允许的空闲连接数,如果没有sql任务需要执行的连接数大于20,超过的连接会被连接池关闭。
- }
-
- func GetDB() *gorm.DB {
- return _db
- }
可以通过GetDB方法获取_db进行操作。
我们在数据库创建一张测试表,当前也可以通过gorm迁移一张表结构体到数据库,我们这里暂时先创建。表(表名:student)结构如下:

在项目文件夹下增加db_entity文件夹存放表实体。如下图:

student_entity.go代码如下:
- package db_entity
-
- import "time"
-
- type Student struct {
- Id int32 `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT;comment:'id'"`
- Name string `json:"name" gorm:"column:name;type:varchar(255);comment:'名字'"`
- Age int64 `json:"age" gorm:"column:age;comment:'年龄'"`
- Content string `json:"content" gorm:"column:content;type:varchar(255);comment:'描述'"`
- UpdateTime time.Time `json:"update_time" gorm:"column:update_time"`
- DelFlag int64 `json:"del_flag" gorm:"column:del_flag;comment:'删除标识'"`
- }
-
- // 自定义表名
- func (Student) TableName() string {
- return "student"
- }
按照之前项目结构优化后的方式添加接口,参考:Go语学习笔记 - 项目规范结构调整 | Web框架Gin(三)_剑客阿良_ALiang的博客-CSDN博客
在app/services目录下增加student._service.go文件,代码如下:
- package services
-
- import (
- "learn-gin/app/pojo/req"
- "learn-gin/app/pojo/rsp"
- "learn-gin/config/log"
- "learn-gin/config/mysql"
- "learn-gin/db_entity"
- "time"
- )
-
- type StudentService interface {
- AddStudent(req *req.StudentAddReq)
- }
-
- type StudentImpl struct {
- }
-
- // 添加学生
- func (t StudentImpl) AddStudent(req *req.StudentAddReq) rsp.ResponseMsg {
- log.Logger.Info("添加学生参数:", log.Any("StudentReq", req))
- _db := mysql.GetDB()
- var _student db_entity.Student
- _student.Name = req.Name
- _student.Age = req.Age
- _student.Content = req.Content
- _student.UpdateTime = time.Now()
- _student.DelFlag = 0
- _db.Create(&_student)
- return *rsp.SuccessMsg("添加成功")
- }
其中app/pojo/req下增加请求结构体StudentAddReq,在app/pojo/req目录下增加student_request.go文件。
代码如下:
- package req
-
- type StudentAddReq struct {
- Name string `json:"name"`
- Age int64 `json:"age"`
- Content string `json:"content"`
- }
在app/services/service.go增加student服务对象,代码如下:
- package services
-
- var (
- TestServ = &Test{}
- StudentServ = &StudentImpl{}
- )
在app/controllers下增加student_controller.go文件。

代码如下:
- package controllers
-
- import (
- "encoding/json"
- "github.com/gin-gonic/gin"
- "learn-gin/app/pojo/req"
- "learn-gin/app/services"
- "learn-gin/config/log"
- "net/http"
- )
-
- type StudentController struct {
- }
-
- func (s StudentController) StudentAddOne(context *gin.Context) {
- var addStudentReq req.StudentAddReq
- log.Logger.Info("StudentAddOne接口")
- // 将前端穿过来的json数据绑定存储在这个实体类中,BindJSON()也能使用
- if err := context.ShouldBindJSON(&addStudentReq); err != nil {
- log.Logger.Panic("参数异常")
- }
-
- if _, err := json.Marshal(addStudentReq); err != nil {
- log.Logger.Panic("参数解析异常")
- }
- _rsp := services.StudentServ.AddStudent(&addStudentReq)
- context.JSON(http.StatusOK, _rsp)
- }
在app/controllers/controllers.go文件增加student_controller中的控制层对象。
代码如下:
- package controllers
-
- var (
- TestCtrl = &TestController{}
- StudentCtrl = &StudentController{}
- )
在app/router目录下增加student_router.go文件。

代码如下:
- package router
-
- import (
- "github.com/gin-gonic/gin"
- "learn-gin/app/controllers"
- )
-
- func StudentRouter(r *gin.Engine) {
- r.POST("/student/addOne", controllers.StudentCtrl.StudentAddOne)
- }
在app/router/router.go下绑定StudentRouter。
- package router
-
- import "github.com/gin-gonic/gin"
-
- func InitRouter(r *gin.Engine) {
- // 测试路由
- TestRouter(r)
- // 学生路由
- StudentRouter(r)
- }
代码完成后,我们测试一下表新增接口。

OK,我们看一下表数据。

没什么问题。
没想到写着写着都有30篇了,gorm还在研究,后面会把表操作都写一写。
