超级详细:Go语言框架Gin和Gorm实现一个完整的待办事项微服务

前言本文通过一步一步的设计 , 最终实现一个完善的todo应用 。
我们使用GO框架Gin用户路由控制和返回数据 。 使用Gorm用于操作数据库 。
读者可根据本教程操作 , 最终实现列出的各项功能 。
超级详细:Go语言框架Gin和Gorm实现一个完整的待办事项微服务文章插图
技术清单本文中所涉及的技术内容主要有以下几种:

  1. Gin:轻量高效性能爆棚的WEB框架
  2. Gorm:一个关系型数据库的ORM工具包 , 避免直接SQL语句操作
  3. MySQL:数据库
  4. curl工具 , 用于API接口数据测试
另外 , 使用的GO版本是
go version go1.13.5 windows/amd64
对于第2,3条内容 , 可使用以下指令安装
go get -u github.com/gin-gonic/gin
go get -u github.com/jinzhu/gorm
对于工具curl , 我们使用的是 git bash内自带的指令 。 如果是linux下用户 , 开箱即用 。
创建数据库【超级详细:Go语言框架Gin和Gorm实现一个完整的待办事项微服务】本文使用MySQL数据库装载数据 。 本节我们仅需创建一个空的数据库 , 就可以了 。 表结构在下一节使用gorm迁移功能创建 。
使用Navicat工具新建界面如下图 。
超级详细:Go语言框架Gin和Gorm实现一个完整的待办事项微服务文章插图
需要特别留意数据库字符集编码使用 utf8mb4 , 这个是MySQL真正的utf8 , 用于中文字符支持 。
创建表模型gorm中的Automigrate()操作 , 用于刷新数据库中的表 , 使其保持最新 。 即让数据库之前存储的记录的表字段和程序中最新使用的表字段保持一致(只增不减) 。
我们先建一个todos表模型 。
type ( todoModel struct {gorm.ModelTitlestring `json:"title"`Completed int`json:"completed` } transformedTodo struct {IDuint`json:"id"`Titlestring `json:"title"`Completed bool`json:"completed"` })其中 todoModel用于数据库todos表 。 我们默认继承使用了gorm.Model的字段 , 主要包括以下几个:
// gorm.Model 定义type Model struct {IDuint `gorm:"primary_key"`CreatedAt time.TimeUpdatedAt time.TimeDeletedAt *time.Time}数据库表会自动生成上述4个字段 , 并追加 title , completed两个字段 。 模型名与表名不一致 , 我们手动指定表名:
// 指定表名func (todoModel) TableName() string { return "todos"}然后在代码初始化过程中执行迁移 。
var db *gorm.DB// 初始化func init() { var err error var constr string constr = fmt.Sprintf("%s:%s@(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", "root", "111213", "localhost", 3306, "05-gin-gorm-todo") db, err = gorm.Open("mysql", constr) if err != nil {panic("数据库连接失败") } db.AutoMigrate(&todoModel{})}首先声明一个 gorm.DB , 用于数据库操作 。
在使用gorm包之前 , 需要导入 。
import ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql")第二项我们仅导入而不使用 。 这个导入操作 , gorm执行了下述操作
这样我们无需重新手动处理包依赖关系 。
MySQL的连接字符串是有特定格式的 , 这也是由底层 go-sql-driver/mysql 决定的参数配置项 。 其含义如下:
user:password@(hostname:port)/database_name?charset=utf8mb4&parseTime=True&loc=Local此处我们使用的本地数据库3306端口 , root用户 , 和 05-gin-gorm-todo 数据库 。
在执行完整的程序之后 , todos表会被自动迁移创建 , 其详细参数如下图 。
超级详细:Go语言框架Gin和Gorm实现一个完整的待办事项微服务文章插图
这张表也是我们本文所操作的数据基础 。
规划路由依照restful风格的API设计标准 , 我们规划了5个路由 , 涵盖了一个todo列表清单的增删改查功能 。
func main() { r := gin.Default() v1 := r.Group("/api/v1/todo") {v1.POST("/", add)// 添加新条目v1.GET("/", all)// 查询所有条目v1.GET("/:id", take)// 获取单个条目v1.PUT("/:id", update) // 更新单个条目v1.DELETE("/:id", del) // 删除单个条目 } r.Run(":9089")}这个是最终会使用到的main函数 , 使用了gin提供的路由功能 。 为了扩展方便 , 我们使用了gin路由的Group功能 , 将版本v1的所有路由集中处理 。
其中 , 访问的方法跟别使用 POST表示添加 , GET表示查询 , PUT表是更新 , DELETE表示删除 , 这是restful API设计的一般性方法 。
API功能上一节规划的路由中 , 我们声明了5个函数 , 本节逐一实现这5个函数 。 注意API返回数据都是JSON格式 。
为了统一返回状态码 , 对于正确响应的 , 返回HTTP CODE = 200 。 JSON数据的正常与否 , 使用两个常量表示 , 如下: