gin框架学习-Gin框架和Gorm框架搭建一个简单的API微服务

前言

感谢开源项目gin-vue-admin,以及1010工作室的视频教程
本人学识尚浅,如有错误,请评论指出,谢谢!
详细可见个人博客:https://linzyblog.netlify.app/

本章会用到的技术,不太熟悉的可以去看看我以前的文章

  1. 快速安装gin框架:https://blog.csdn.net/weixin_46618592/article/details/125540869
  2. HTTP请求:https://blog.csdn.net/weixin_46618592/article/details/125565789
  3. Gorm入门指南:https://blog.csdn.net/weixin_46618592/article/details/125647217
  4. GORM框架进阶之CRUD接口(数据库增删改查操作):https://blog.csdn.net/weixin_46618592/article/details/125740498

一、设计思路

这章动手把前面学过的Gin框架内容和Gorm框架结合做一个简单的API 微服务

在这里插入图片描述

我们需要通过前端来完成对数据库数据的增删改查即可,需要如下这样的 API :

  1. POST todos/ 添加数据
  2. GET todos/ 获取数据库所有数据
  3. GET todos/{id} 获取指定 id 的数据
  4. PUT todos/{id} 修改指定 id 的数据
  5. 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: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信息。

//创建一条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框架把之前所学全部展现并结合出来

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lin钟一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值