当前位置:网站首页>Go语学习笔记 - gorm使用 - 数据库配置、表新增 | Web框架Gin(七)
Go语学习笔记 - gorm使用 - 数据库配置、表新增 | Web框架Gin(七)
2022-06-30 20:09:00 【游戏编程】
目录
学习笔记,写到哪是哪。
接着上一篇文章: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 tomlimport ( "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 TomlConfigfunc 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 = 3306Mysql初始化
增加数据库连接初始化代码,mysql_init.go文件添加至config/mysql下,如下图。

mysql_init.go文件代码如下:
package mysqlimport ( "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "learn-gin/config/toml")var _db *gorm.DBfunc 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_entityimport "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 servicesimport ( "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 reqtype StudentAddReq struct { Name string `json:"name"` Age int64 `json:"age"` Content string `json:"content"`}在app/services/service.go增加student服务对象,代码如下:
package servicesvar ( TestServ = &Test{} StudentServ = &StudentImpl{})在app/controllers下增加student_controller.go文件。

代码如下:
package controllersimport ( "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 controllersvar ( TestCtrl = &TestController{} StudentCtrl = &StudentController{})在app/router目录下增加student_router.go文件。

代码如下:
package routerimport ( "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 routerimport "github.com/gin-gonic/gin"func InitRouter(r *gin.Engine) { // 测试路由 TestRouter(r) // 学生路由 StudentRouter(r)}测试接口
代码完成后,我们测试一下表新增接口。

OK,我们看一下表数据。

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

作者:剑客阿良_ALiang
游戏编程,一个游戏开发收藏夹~
如果图片长时间未显示,请使用Chrome内核浏览器。
边栏推荐
- Jerry's long press reset [chapter]
- 请问海量数据如何去取最大的K个
- Wechat applet development practice cloud music
- Pytorch implements the calculation of flops and params
- 谈谈内联函数
- 大神详解开源 BUFF 增益攻略丨直播
- Basic components of STL
- 北京大学ACM Problems 1005:I Think I Need a Houseboat
- Lumiprobe 聚乙二醇化和 PEG 接头丨碘-PEG3-酸研究
- The newly born robot dog can walk by himself after rolling for an hour. The latest achievement of Wu Enda's first disciple
猜你喜欢

Lumiprobe染料酰肼丨BDP FL 酰肼方案

Lambda 表达式原理分析学习(2022.06.23)

Exness: the final value of US GDP unexpectedly accelerated to shrink by 1.6%

基于开源流批一体数据同步引擎ChunJun数据还原—DDL解析模块的实战分享

Halcon知识:盘点一下计量对象【1】

Maya house modeling

maya房子建模

The Commission is so high that everyone can participate in the new programmer's partner plan

NLP skill tree learning route - (I) route overview

NLP 论文领读|文本生成模型退化怎么办?SimCTG 告诉你答案
随机推荐
项目经理面试常见问题及回答技巧
北京大学ACM Problems 1004:Financial Management
Introduction to neural network (Part 1)
树基本概念
Go学习笔记
jfinal中如何使用过滤器监控Druid监听SQL执行?
Common questions and answering skills of project manager interview
Jerry's touch key recognition process [chapter]
Lumiprobe 聚乙二醇化和 PEG 接头丨碘-PEG3-酸研究
杰理之触摸按键识别流程【篇】
Peking University ACM problems 1000:a+b problem
PM reports work like this, and the boss is willing to give you a raise
基于开源流批一体数据同步引擎ChunJun数据还原—DDL解析模块的实战分享
Informatics Olympiad 1362: family problems
Tensorflow2.4 implementation of repvgg
Installation and use of securecrtportable
Is the project manager a leader? Can you criticize and blame members?
Wechat applet development practice cloud music
Lumiprobe生物素亚磷酰胺(羟脯氨酸)说明书
The newly born robot dog can walk by himself after rolling for an hour. The latest achievement of Wu Enda's first disciple