当前位置:网站首页>Go语学习笔记 - gorm使用 - 数据库配置、表新增 | Web框架Gin(七)
Go语学习笔记 - gorm使用 - 数据库配置、表新增 | Web框架Gin(七)
2022-06-28 12:43:00 【剑客阿良_ALiang】
目录
学习笔记,写到哪是哪。
接着上一篇文章: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:%[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(三)_剑客阿良_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还在研究,后面会把表操作都写一写。

边栏推荐
- 真正的学懂三极管入门篇(经典)「建议收藏」
- 一款自动生成单元测试的 IDEA 插件,开发效率提升 70% 以上!
- 深入理解贝叶斯定理
- NFT数字藏品系统开发(3D建模经济模型开发案例)
- pwn入门(1)二进制基础
- 张同学回应首场直播带货
- Mr. Zhang responded to the first live broadcast with goods
- Jerry's wif interferes with Bluetooth [chapter]
- Continuous integration practice of Baidu app based on pipeline as code
- JS class 并不只是简单的语法糖!
猜你喜欢

go template with...end遍历用法

websocket 1 分钟自动断开连接

结构光之相移法+多频外差的数学原理推导
![[unity Editor Extension practice] dynamically generate UI code using TXT template](/img/20/1042829c3880039c528c63d0aa472d.png)
[unity Editor Extension practice] dynamically generate UI code using TXT template

Ipetronik data acquisition equipment and softing q-vision software are committed to ADAS test scheme

The white paper on the panorama of the digital economy and the digitalization of consumer finance were released

Flink stream processing API collection: master all Flink stream processing technologies. Just read this article

吐血推荐17个提升开发效率的“轮子”

从 jsonpath 和 xpath 到 SPL

洛谷_P1303 A*B Problem_高精度计算
随机推荐
Matplotlib_Study01
Some tips on string conversion
杰理之wif 干扰蓝牙【篇】
哪一个证券公司最好最安全 怎么办理开户最安全
In fact, there are a lot of MATLAB learning and use materials (many documents and videos) on the official website of MATLAB
Hundreds of lines of code to implement a JSON parser
arcgis pro 可以实现直连postgresql,编辑图层要素吗
MATLAB的官方网站上其实有很多MATLAB的学习和使用资料(文档、视频都有不少)
企业源代码保密方案分享
ASP. NET CORE Study06
Xiaobai's e-commerce business is very important to choose the right mall system!
小白创业做电商,选对商城系统很重要!
Namespace and scope
JS duration and asynchronous function promise
Jerry's wif interferes with Bluetooth [chapter]
Jerry's wif interferes with Bluetooth [chapter]
多维度监控:智能监控的数据基础
group_ Concat learning and configuration
Matplotlib_ Study01
pwn入门(1)二进制基础