当前位置:网站首页>gin框架学习-Gin框架和Gorm框架搭建一个简单的API微服务
gin框架学习-Gin框架和Gorm框架搭建一个简单的API微服务
2022-07-31 05:10:00 【lin钟一】
目录
前言
感谢开源项目gin-vue-admin,以及1010工作室的教程
本人学识尚浅,代码的注释基于源码的注释翻译,如有错误,请评论指出,谢谢!
详细可见个人博客:https://linzyblog.netlify.app/
本章会用到的技术,不太熟悉的可以去看看我以前的文章
- 快速安装gin框架:https://blog.csdn.net/weixin_46618592/article/details/125540869
- HTTP请求:https://blog.csdn.net/weixin_46618592/article/details/125565789
- Gorm入门指南:https://blog.csdn.net/weixin_46618592/article/details/125647217
- GORM框架进阶之CRUD接口(数据库增删改查操作):https://blog.csdn.net/weixin_46618592/article/details/125740498
一、设计思路
这章动手把前面学过的Gin框架内容和Gorm框架结合做一个简单的API 微服务

我们需要通过前端来完成对数据库数据的增删改查即可,需要如下这样的 API :
- POST todos/ 添加数据
- GET todos/ 获取数据库所有数据
- GET todos/{id} 获取指定 id 的数据
- PUT todos/{id} 修改指定 id 的数据
- DELETE todos/{id} 删除指定 id 的数据
二、编写后端请求
创建一个 todos 文件夹,用VSCode打开当前文件夹
1、在Terminal终端输入 go mod
go mod init todo
创建包管理工具,此命令会在当前目录中初始化和创建一个新的go.mod文件,手动创建go.mod文件再包含一些module声明也等同该命令,而go mod init命令便是帮我们简便操作,可以帮助我们自动创建。
2、下载并安装所需要的包
go get -u github.com/gin-gonic/gin
go get -u gorm.io/driver/mysql
go get -u gorm.io/gorm
3、创建路由
在 todo 文件夹下创建一个名为 main.go 的文件,在 main 文件中创建一个类似下面的路由,将同一个功能模块放到同一个路由分组中,代码更美观易懂
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
v1 := router.Group("/api/v1/todos")
{
v1.POST("/", createTodo)
v1.GET("/", fetchAllTodo)
v1.GET("/:id", fetchSingleTodo)
v1.PUT("/:id", updateTodo)
v1.DELETE("/:id", deleteTodo)
}
router.Run()
}
4、数据库连接
现在我们要实现数据库连接就要用到GORM框架,GORM框架是go的一个数据库连接及交互框架,主要是把struct类型和数据库记录进行映射,数据库语句复杂的情况下可以直接手写语句,一般用于连接关系型数据库,这里我主要使用MySQL数据库。
1)设计数据表
//数据库字段
type todoModel struct {
gorm.Model
Title string `json:"title"`
Completed int `json:"completed"`
}
//处理返回字段
type transformedTodo struct {
ID int `json:"id"`
Title string `json:"title"`
Completed bool `json:"completed"`
}
2)数据库连接
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var db *gorm.DB
func init() {
dsn := "root:[email protected](127.0.0.1:3306)/go_test?charset=utf8&parseTime=True"
var err error
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
})
if err != nil {
panic(err.Error())
}
//自动创建数据表
db.AutoMigrate(&todoModel{
})
}
三、实现路由方法
1、创建一条记录
使用到了 Gin 框架中的 Context 上下文来接收 POST 方式传过来的参数,用 Gorm框架 连接数据库使用Save方法或者Create方法都可以来保存相关的数据到数据库,之后会给前端用户返回一个 JSON信息。
//创建一条todo记录
func createTodo(c *gin.Context) {
completed, err := strconv.Atoi(c.PostForm("completed"))
if err != nil {
panic(err.Error())
}
todo := todoModel{
Title: c.PostForm("title"),
Completed: completed,
}
db.Save(&todo)
c.JSON(http.StatusCreated, gin.H{
"status": http.StatusCreated,
"message": "Todo item created successfully",
"resourceId": todo.ID,
})
}
- POST请求

- 数据库

2、查询所有记录
使用到了 Gin 框架中的 GET 请求,没有参数,用 Gorm 框架连接数据库使用Find方法查询所有记录,封装在JSON里返回给前端用户
//获取数据库所有todo
func selectAllTodo(c *gin.Context) {
var todos []todoModel
var rq_todos []transformedTodo
db.Find(&todos)
if len(todos) <= 0 {
c.JSON(http.StatusNotFound, gin.H{
"status": http.StatusNotFound,
"message": "No todo found!",
})
return
}
for _, item := range todos {
completed := false
if item.Completed == 1 {
completed = true
}
rq_todos = append(rq_todos, transformedTodo{
ID: int(item.ID),
Title: item.Title,
Completed: completed,
})
}
c.JSON(http.StatusOK, gin.H{
"status": http.StatusOK,
"data": rq_todos,
})
}
- GET请求

- 数据库

3、查找指定id的记录
使用到了 Gin 框架中的 Context 上下文来接收 GET 方式存放在URI里传过来的参数,用 Gorm 框架连接数据库使用Find方法或者First方法查询指定记录,封装在JSON里返回给前端用户
//查找指定todo
func selectSingleTodo(c *gin.Context) {
var todo todoModel
todoID := c.Param("id")
db.First(&todo, todoID)
if todo.ID == 0 {
c.JSON(http.StatusNotFound, gin.H{
"status": http.StatusNotFound,
"message": "No todo found!",
})
return
}
completed := false
if todo.Completed == 1 {
completed = true
}
rp_todo := transformedTodo{
ID: int(todo.ID),
Title: todo.Title,
Completed: completed,
}
c.JSON(http.StatusOK, gin.H{
"status": http.StatusOK,
"data": rp_todo,
})
}
- GET请求

4、修改指定id记录
使用到了 Gin 框架中的 Context 上下文来接收 PUT 方式传过来的参数,用 Gorm 框架连接数据库使用Find方法或者First方法查询指定记录,然后通过Update方法修改记录,返回给前端用户修改成功信息。
//修改指定id todo
func updateTodo(c *gin.Context) {
var todo todoModel
todoID := c.Param("id")
db.First(&todo, todoID)
if todo.ID == 0 {
c.JSON(http.StatusNotFound, gin.H{
"status": http.StatusNotFound,
"message": "No todo found!",
})
return
}
completed, _ := strconv.Atoi(c.PostForm("completed"))
db.Model(&todo).Updates(&todoModel{
Title: c.PostForm("title"),
Completed: completed,
})
c.JSON(http.StatusOK, gin.H{
"status": http.StatusOK,
"message": "Todo updated successfully",
})
}
- PUT请求

- 数据库

5、删除指定id记录
使用到了 Gin 框架中的 Context 上下文来接收 DELETE 方式存放在URI里传过来的参数,用 Gorm 框架连接数据库使用First方法或者Find查询指定id记录,用Delete删除指定id记录,返回给前端用户删除成功信息。
//删除指定id todo
func deleteTodo(c *gin.Context) {
var todo todoModel
todoID := c.Param("id")
db.First(&todo, todoID)
if todo.ID == 0 {
c.JSON(http.StatusNotFound, gin.H{
"status": http.StatusNotFound,
"message": "No todo found!",
})
return
}
db.Delete(&todo)
c.JSON(http.StatusOK, gin.H{
"status": http.StatusOK,
"message": "todo Deleted successfully",
})
}
- DELETE请求

- 数据库

四、结论
这章只是把前面的基础的知识Gin框架和Gorm框架结合一起实现,日志、JWT认证和Casbin框架我还没用到,后面我将会学习gva框架把之前所学全部展现并结合出来
边栏推荐
- MySQL_关于JSON数据的查询
- Swordsman Offer Special Assault Edition ---- Day 6
- If the account number or password is entered incorrectly for many times, the account will be banned.
- 13 【代理配置 插槽】
- tf.keras.utils.pad_sequences()
- The interviewer asked me TCP three handshake and four wave, I really
- 基于flask的三方登陆的流程
- 闭包(四)----IIFE
- Simple command of mysql
- 08 【生命周期 组件】
猜你喜欢
随机推荐
剑指offer专项突击版 ---第 5 天
pytorch中的一维、二维、三维卷积操作
剑指offer基础版 ----- 第25天
剑指offer基础版 ---- 第29天
wpf wrapPanel居中并从左到右排列
uni-app进阶之创建组件/原生渲染【day9】
关于LocalDateTime的全局返回时间带“T“的时间格式处理
【LeetCode-SQL每日一练】——2. 第二高的薪水
[Introduction to MySQL 8 to Mastery] Basics - silent installation of MySQL on Linux system, cross-version upgrade
一文了解大厂的DDD领域驱动设计
账号或密码多次输入错误,进行账号封禁
Flink sink redis writes to Redis
Interviewer: If the order is not paid within 30 minutes, it will be automatically canceled. How to do this?
03 【数据代理 事件处理】
Mysql——字符串函数
Simple command of mysql
Flask 的初识
wpf ScrowViewer水平滚动
字符串的扩展
【一起学Rust】Rust的Hello Rust详细解析









