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文件调整后代码如下:

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初始化

增加数据库连接初始化代码,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还在研究,后面会把表操作都写一写。

猜你喜欢

转载自blog.csdn.net/zhiweihongyan1/article/details/125482418