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


    目录

    依赖安装

    Mmysql配置 

    Mysql初始化

    添加表

    表新增操作

    测试接口

    小结


    学习笔记,写到哪是哪。

    接着上一篇文章:Go语学习笔记 - 增加文件下载工具 | Web框架Gin(六)_剑客阿良_ALiang的博客-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(二)_剑客阿良_ALiang的博客-CSDN博客_config.toml

    toml_config.go文件调整后代码如下:

    1. package toml
    2. import (
    3. "fmt"
    4. "github.com/spf13/viper"
    5. )
    6. type TomlConfig struct {
    7. AppName string
    8. Log LogConfig
    9. Mysql MysqlConfig
    10. }
    11. // 日志保存地址
    12. type LogConfig struct {
    13. Path string
    14. Level string
    15. }
    16. // 日志保存地址
    17. type MysqlConfig struct {
    18. Host string
    19. User string
    20. Password string
    21. DbName string
    22. Port int64
    23. }
    24. var c TomlConfig
    25. func init() {
    26. // 设置文件名
    27. viper.SetConfigName("config")
    28. // 设置文件类型
    29. viper.SetConfigType("toml")
    30. // 设置文件路径,可以多个viper会根据设置顺序依次查找
    31. viper.AddConfigPath(".")
    32. viper.AutomaticEnv()
    33. err := viper.ReadInConfig()
    34. if err != nil {
    35. panic(fmt.Errorf("fatal error config file: %s", err))
    36. }
    37. viper.Unmarshal(&c)
    38. }
    39. func GetConfig() TomlConfig {
    40. return c
    41. }

    可以看到增加了MysqlConfig结构体。

    配置文件config.toml文件增加mysql对应配置,修改后如下:

    1. appName = "learn-gin"
    2. [log]
    3. level = "debug"
    4. path = "logs/learn.log"
    5. [mysql]
    6. host = "xx.xx.xx.xx"
    7. user = "root"
    8. password = "xxxxxx"
    9. dbName = "test-c"
    10. port = 3306

    Mysql初始化

    增加数据库连接初始化代码,mysql_init.go文件添加至config/mysql下,如下图。

    mysql_init.go文件代码如下:

    1. package mysql
    2. import (
    3. "fmt"
    4. "gorm.io/driver/mysql"
    5. "gorm.io/gorm"
    6. "gorm.io/gorm/logger"
    7. "learn-gin/config/toml"
    8. )
    9. var _db *gorm.DB
    10. func init() {
    11. username := toml.GetConfig().Mysql.User //账号
    12. password := toml.GetConfig().Mysql.Password //密码
    13. host := toml.GetConfig().Mysql.Host //数据库地址,可以是Ip或者域名
    14. port := toml.GetConfig().Mysql.Port //数据库端口
    15. Dbname := toml.GetConfig().Mysql.DbName //数据库名
    16. timeout := "10s" //连接超时,10秒
    17. //拼接下dsn参数, dsn格式可以参考上面的语法,这里使用Sprintf动态拼接dsn参数,因为一般数据库连接参数,我们都是保存在配置文件里面,需要从配置文件加载参数,然后拼接dsn。
    18. dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
    19. var err error
    20. //连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
    21. _db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
    22. Logger: logger.Default.LogMode(logger.Info),
    23. })
    24. if err != nil {
    25. panic("连接数据库失败, error=" + err.Error())
    26. }
    27. sqlDB, _ := _db.DB()
    28. //设置数据库连接池参数
    29. sqlDB.SetMaxOpenConns(100) //设置数据库连接池最大连接数
    30. sqlDB.SetMaxIdleConns(20) //连接池最大允许的空闲连接数,如果没有sql任务需要执行的连接数大于20,超过的连接会被连接池关闭。
    31. }
    32. func GetDB() *gorm.DB {
    33. return _db
    34. }

     可以通过GetDB方法获取_db进行操作。

    添加表

    我们在数据库创建一张测试表,当前也可以通过gorm迁移一张表结构体到数据库,我们这里暂时先创建。表(表名:student)结构如下:

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

    student_entity.go代码如下:

    1. package db_entity
    2. import "time"
    3. type Student struct {
    4. Id int32 `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT;comment:'id'"`
    5. Name string `json:"name" gorm:"column:name;type:varchar(255);comment:'名字'"`
    6. Age int64 `json:"age" gorm:"column:age;comment:'年龄'"`
    7. Content string `json:"content" gorm:"column:content;type:varchar(255);comment:'描述'"`
    8. UpdateTime time.Time `json:"update_time" gorm:"column:update_time"`
    9. DelFlag int64 `json:"del_flag" gorm:"column:del_flag;comment:'删除标识'"`
    10. }
    11. // 自定义表名
    12. func (Student) TableName() string {
    13. return "student"
    14. }

    表新增操作

    按照之前项目结构优化后的方式添加接口,参考:Go语学习笔记 - 项目规范结构调整 | Web框架Gin(三)_剑客阿良_ALiang的博客-CSDN博客

    在app/services目录下增加student._service.go文件,代码如下:

    1. package services
    2. import (
    3. "learn-gin/app/pojo/req"
    4. "learn-gin/app/pojo/rsp"
    5. "learn-gin/config/log"
    6. "learn-gin/config/mysql"
    7. "learn-gin/db_entity"
    8. "time"
    9. )
    10. type StudentService interface {
    11. AddStudent(req *req.StudentAddReq)
    12. }
    13. type StudentImpl struct {
    14. }
    15. // 添加学生
    16. func (t StudentImpl) AddStudent(req *req.StudentAddReq) rsp.ResponseMsg {
    17. log.Logger.Info("添加学生参数:", log.Any("StudentReq", req))
    18. _db := mysql.GetDB()
    19. var _student db_entity.Student
    20. _student.Name = req.Name
    21. _student.Age = req.Age
    22. _student.Content = req.Content
    23. _student.UpdateTime = time.Now()
    24. _student.DelFlag = 0
    25. _db.Create(&_student)
    26. return *rsp.SuccessMsg("添加成功")
    27. }

    其中app/pojo/req下增加请求结构体StudentAddReq,在app/pojo/req目录下增加student_request.go文件。

     

    代码如下:

    1. package req
    2. type StudentAddReq struct {
    3. Name string `json:"name"`
    4. Age int64 `json:"age"`
    5. Content string `json:"content"`
    6. }

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

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

    在app/controllers下增加student_controller.go文件。

    代码如下:

    1. package controllers
    2. import (
    3. "encoding/json"
    4. "github.com/gin-gonic/gin"
    5. "learn-gin/app/pojo/req"
    6. "learn-gin/app/services"
    7. "learn-gin/config/log"
    8. "net/http"
    9. )
    10. type StudentController struct {
    11. }
    12. func (s StudentController) StudentAddOne(context *gin.Context) {
    13. var addStudentReq req.StudentAddReq
    14. log.Logger.Info("StudentAddOne接口")
    15. // 将前端穿过来的json数据绑定存储在这个实体类中,BindJSON()也能使用
    16. if err := context.ShouldBindJSON(&addStudentReq); err != nil {
    17. log.Logger.Panic("参数异常")
    18. }
    19. if _, err := json.Marshal(addStudentReq); err != nil {
    20. log.Logger.Panic("参数解析异常")
    21. }
    22. _rsp := services.StudentServ.AddStudent(&addStudentReq)
    23. context.JSON(http.StatusOK, _rsp)
    24. }

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

    代码如下:

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

    在app/router目录下增加student_router.go文件。

    代码如下:

    1. package router
    2. import (
    3. "github.com/gin-gonic/gin"
    4. "learn-gin/app/controllers"
    5. )
    6. func StudentRouter(r *gin.Engine) {
    7. r.POST("/student/addOne", controllers.StudentCtrl.StudentAddOne)
    8. }

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

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

    测试接口

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

    OK,我们看一下表数据。

    没什么问题。

    小结

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

     

  • 相关阅读:
    用人工智能技术完善国内人力资源管理
    常见项目管理中npm包操作总结
    Win11拖拽文件偶现卡顿死机情况解决
    CF1427F-Boring Card Game【贪心】
    vscode自动添加文件和函数注释
    无涯教程-JavaScript - IMTAN函数
    vue2与vue3的使用区别与组件通信
    美术 3.2 2D动画Spine基础教学
    springboot异步注解@Async使用自定义线程池执行异步任务
    bat脚本字符串替换:路径中\需要替换,解决一些文件写入路径不对的问题
  • 原文地址:https://blog.csdn.net/zhiweihongyan1/article/details/125482418