本文最后更新于:1 年前
前言
本章会用到的技术,不太熟悉的可以去看看我以前的文章
- 快速安装gin框架:https://linzyblog.netlify.app/2022/07/18/gin/
- HTTP请求:https://linzyblog.netlify.app/2022/07/18/gin-http/
- Gorm入门指南:https://linzyblog.netlify.app/2022/07/19/gin-gorm1/
- GORM框架进阶之CRUD接口(数据库增删改查操作):https://linzyblog.netlify.app/2022/07/19/gin-gorm2/
一、设计思路
这章动手把前面学过的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文件,手动创建go.mod文件再包含一些module声明也等同该命令,而go mod init命令便是帮我们简便操作,可以帮助我们自动创建。
2、下载并安装所需要的包
1 2 3
| 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 文件中创建一个类似下面的路由,将同一个功能模块放到同一个路由分组中,代码更美观易懂
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 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)设计数据表
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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)数据库连接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| package main
import ( "gorm.io/driver/mysql" "gorm.io/gorm" )
var db *gorm.DB
func init() { dsn := "root:123456@tcp(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信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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, }) }
|
2、查询所有记录
使用到了 Gin 框架中的 GET 请求,没有参数,用 Gorm 框架连接数据库使用Find方法查询所有记录,封装在JSON里返回给前端用户
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| 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, }) }
|
3、查找指定id的记录
使用到了 Gin 框架中的 Context 上下文来接收 GET 方式存放在URI里传过来的参数,用 Gorm 框架连接数据库使用Find方法或者First方法查询指定记录,封装在JSON里返回给前端用户
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| 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, }) }
|
4、修改指定id记录
使用到了 Gin 框架中的 Context 上下文来接收 PUT 方式传过来的参数,用 Gorm 框架连接数据库使用Find方法或者First方法查询指定记录,然后通过Update方法修改记录,返回给前端用户修改成功信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 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", }) }
|
5、删除指定id记录
使用到了 Gin 框架中的 Context 上下文来接收 DELETE 方式存放在URI里传过来的参数,用 Gorm 框架连接数据库使用First方法或者Find查询指定id记录,用Delete删除指定id记录,返回给前端用户删除成功信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 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", }) }
|
四、结论
这章只是把前面的基础的知识Gin框架和Gorm框架结合一起实现,日志、JWT认证和Casbin框架我还没用到,后面我将会学习gva框架把之前所学全部展现并结合出来