当前位置:网站首页>Go语学习笔记 - gorm使用 - 数据库配置、表新增 Web框架Gin(七)
Go语学习笔记 - gorm使用 - 数据库配置、表新增 Web框架Gin(七)
2022-07-30 05:50:00 【m0_67402970】
目录
学习笔记,写到哪是哪。
接着上一篇文章: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
}
可以看到增加了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:%[email protected](%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(三)_的博客-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还在研究,后面会把表操作都写一写。
边栏推荐
- 使用 Grafana 的 Redis Data Source 插件监控 Redis
- How does Redis prevent oversold and inventory deduction operations?
- 向量三重积的等式推导证明
- Bull: remove common characters
- Ali Ermian: How many cluster solutions does Redis have?I answered 4
- Redis 如何实现防止超卖和库存扣减操作?
- MongoDB - Introduction, Data Types, Basic Statements
- Linx common directory & file management commands & VI editor usage introduction
- 华为发布“十大发明”,包含计算、智能驾驶等新领域
- Test Development Engineer Growth Diary 018 - Record of Required Questions for Test Interview (Continuous Update)
猜你喜欢
What new materials are used in the large aircraft C919?
如何理解普吕克坐标(几何理解)
Advanced multi-threading (CountDownLatch, deadlock, thread-safe collection class)
Equation Derivation Proof of Vector Triple Product
prometheus-Federation机制配置
Calculate the inverse source of the matrix (using the adjoint matrix, a 3x3 matrix)
搭建vsftpd服务并实现本地用户访问
Boot process and service control
你被MySQL 中的反斜杠 \\坑过吗?
B站崩了,如果是你是那晚负责的开发人员你会怎么做?
随机推荐
uniapp中canvas与v-if更“配”
Test and Development Engineer Growth Diary 009 - Environment Pai Pai Station: Development Environment, Test Environment, Production Environment, UAT Environment, Simulation Environment
How does Redis prevent oversold and inventory deduction operations?
上传文件--文件类型大全,图片类型,文档类型,视频类型,压缩包类型
向量的导数运算和向量叉乘以及点乘的导数运算
The introduction of AI meta-learning into neuroscience, the medical effect is expected to improve accurately
Bull: remove common characters
DHCP principle and configuration
MySQL什么时候用表锁,什么时候用行锁?
The calculation and source code of the straight line intersecting the space plane
schur completement
Redis download and installation
Boot process and service control
Polygon 3D(三维平面多边形)的法向量的计算(MeshLab默认的计算)
node.js中实现对数据库的链式操作
分布式系统中的开创者—莱斯利·兰伯特
MySQL主从复制配置搭建,一步到位
开发常用工具软件
空间顶点到直线的距离计算及其源码
iptables命令