• Go语学习笔记 - gorm使用 - 数据库配置、表新增 Web框架Gin(七)


    目录

    依赖安装

    Mmysql配置?

    Mysql初始化

    添加表

    表新增操作

    测试接口

    小结


    学习笔记,写到哪是哪。

    接着上一篇文章:Go语学习笔记 - 增加文件下载工具 | Web框架Gin(六)_的博客-CSDN博客

    我已经把暂时想到的工具类补充好了,开始数据库的连接和使用。

    从这篇开始会慢慢在增加数据库的相关操作。

    项目地址:github地址

    依赖安装

    首先安装一下所需要的gorm和mysql驱动。

    安装指令如下:

    go get -u gorm.io/gorm

    go get -u gorm.io/driver/mysql

    Mmysql配置

    修改配置文件toml_config.go,增加mysql相关配置。

    具体的使用方式参考:Go语学习笔记 - 配置文件使用、日志配置 | Web框架Gin(二)_的博客-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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    可以看到增加了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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    Mysql初始化

    增加数据库连接初始化代码,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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    可以通过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"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    表新增操作

    按照之前项目结构优化后的方式添加接口,参考:Go语学习笔记 - 项目规范结构调整 | Web框架Gin(三)_的博客-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("添加成功")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    其中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"`
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在app/services/service.go增加student服务对象,代码如下:

    package services
    
    var (
    	TestServ    = &Test{}
    	StudentServ = &StudentImpl{}
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在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)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    在app/controllers/controllers.go文件增加student_controller中的控制层对象。

    代码如下:

    package controllers
    
    var (
    	TestCtrl    = &TestController{}
    	StudentCtrl = &StudentController{}
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在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)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在app/router/router.go下绑定StudentRouter。

    package router
    
    import "github.com/gin-gonic/gin"
    
    func InitRouter(r *gin.Engine) {
    	// 测试路由
    	TestRouter(r)
    	// 学生路由
    	StudentRouter(r)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    测试接口

    代码完成后,我们测试一下表新增接口。

    OK,我们看一下表数据。

    没什么问题。

    小结

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

  • 相关阅读:
    _cpp 位图
    获取泛型对应的类
    蓝牙SDK状态机与车载音频HSM状态机比较
    传统堡垒机数据可以迁移到云堡垒机上吗?方式有哪些?
    微信小程序开启横屏调试
    你真的会解决android ANR 问题吗?
    QT中计算日期差,并进行加减
    枚举 k-v 根据 k 获取 v
    Python的常用排序算法实现
    Java私活200元,完成JavaSwing学生成绩管理系统(三)
  • 原文地址:https://blog.csdn.net/m0_67402970/article/details/126032166