基于Gin+Gorm+Mysql 完成的一个小Demo

前几天刚刚接触了Gin后迫不及待的自己根据原有经验封装了一个层次比较清晰的一个小框架,但是

由于在执行数据操作时感觉一些繁琐,并且查阅了一些资料,看了一下up主分享的学习视频后就产生了今天的组合,这个也是官方文档上有的资料。和大家简单说一下今天与前几天的区别,前几天的趋近于原生操作不易理解,书写也繁琐,今日的数据操作简单易懂 更加清晰明了。今天的话主要细讲一下数据操作,其他部分感兴趣的朋友 可以两篇文章 和在一起研究。

第一部分 框架

今天的框架,封装的很简单,也通俗易懂,不会安装的兄弟 可以借鉴一下我以前的博客

基于Gin+Gorm+Mysql 完成的一个小Demo_第1张图片

安装准备

/** 准备
gin    go get -u github.com/gin-gonic/gin
gorm   go get -u gorm.io/gorm go get -u gorm.io/driver/sqlite
mysql  go get -u gorm.io/driver/msyql
*/

第二部分 连接数据库 在database/mysql.go 并执行数据迁移完成建表

这个数据库连接操作在gorm手册中是有的https://learnku.com/docs/gorm/v2/connecting_to_the_database/9731

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

func main() {
  // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
  dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}
基于Gin+Gorm+Mysql 完成的一个小Demo_第2张图片

在上述图片中红框框的标注是需要注意的 :

第一是在方法名的命名上 原因:在框架封装后方便后续数据库的执行操作调用

第二是在数据库config配置中的操作防止数据库迁移是对于数据表命名复数的预防

其他的执行操作在手册中都是有记载的,这里就不多说了,相比于前几天的 数据库封住 这个简陋了点 感兴趣的可以用前几天的封装方法

配置完成后,需要在入口文件进行数据的初始化连接操作

//初始化数据库
    fmt.Println("初始化数据库连接……")
    if mysql.SqlDb != nil {
        //延迟退出关闭数据库
        defer mysql.SqlDb.Close()
    }

这个时候需要注意的问题文件引入格式需要准确 用这个举个例子下面的话就不进行解释说明了

基于Gin+Gorm+Mysql 完成的一个小Demo_第3张图片

数据库连接完,进行数据迁移 在 models/user.go (用其中的一个举个例子)

在model 中定义数据结构体

// 定义结构体  方便数据迁移
type User struct {
    /**
    注意
    变量必须首字符大写
    gorm 指定类型 json 接收名称 binding required 必传
    */
    gorm.Model
    UserName string `gorm:"type:varchar(20);not null" json:"user_name" binding:"required"`
    State    string `gorm:"type:varchar(20);not null" json:"state" binding:"required"`
    Phone    string `gorm:"type:varchar(20);not null" json:"phone" binding:"required"`
}

定义完在入口文件执行数据迁移操作

//数据库迁移
    err := mysql.DB().AutoMigrate(&models.User{})
    if err != nil {
        fmt.Println("数据库迁移失败")
    }

这个时候DB的问题就来了 和上面引入一样 这里的mysql.DB()执行数据库操作

第三部分 Curd Demo书写

路由

对于路由方面,路由组的书写,以及初始化路由的操作 在前面都有详细介绍,这里的话就直接展示

routers/route.go

// 初始化路由
func InitRouter() *gin.Engine {
    route := gin.Default() //开启服务
    //测试
    route.GET("/", UserController.Index)

    //user路由组
    userGroup := route.Group("admin/user/")
    {
        userGroup.POST("/insert", UserController.Add)
        userGroup.DELETE("/delete/:id", UserController.Delete)
        userGroup.PUT("/update/:id", UserController.Update)
        userGroup.GET("/select/:name", UserController.Sel)
        userGroup.GET("/all", UserController.All)
    }
    return route
}
在入口文件需要注册路由
    //注册路由
    fmt.Println("初始化路由……")
    router := routers.InitRouter()
    router.Run(":8031")

增加

// 增加
func Add(c *gin.Context) {
    //接值
    username := c.Request.FormValue("user_name")
    state := c.Request.FormValue("state")
    phone := c.Request.FormValue("phone")
    //绑定模型
    user := models.User{UserName: username, State: state, Phone: phone}
    mysql.DB().Create(&user)
    c.JSON(http.StatusOK, gin.H{
        "code": 200,
        "msg":  "创建成功",
        "data": "",
    })
}

删除

/**
  删除
   1、找到对应id 的数据
   2、判断id是否存在
   3、成功 数据库删除  失败 返回id
*/

func Delete(c *gin.Context) {
    var data []models.User

    //接收id
    id := c.Param("id")

    //判断id 是否存在
    mysql.DB().Where("id = ?", id).Find(&data)

    //id 存在的情况则删除 不存在报错
    if len(data) == 0 {
        c.JSON(http.StatusOK, gin.H{
            "code": 400,
            "msg":  "id没找到,删除失败",
        })
    } else {
        mysql.DB().Where("id = ?", id).Delete(&data)
        c.JSON(http.StatusOK, gin.H{
            "code": 200,
            "msg":  "删除成功",
        })
    }

}

修改

/**
修改
 1、找到对应id 所对应条目
 2、判断id是否存在
 3、如果存在修改条目 不存在返回id 没有找到
*/

func Update(c *gin.Context) {
    var data models.User

    //接收id
    id := c.Param("id")

    //判断id 是否存在
    mysql.DB().Select("id").Where("id = ?", id).Find(&data)

    //判断id 是否存在
    if data.ID == 0 {
        c.JSON(http.StatusOK, gin.H{
            "code": 400,
            "msg":  "id 没有找到",
        })
    } else {
        //接值
        username := c.Request.FormValue("user_name")
        state := c.Request.FormValue("state")
        phone := c.Request.FormValue("phone")

        mysql.DB().Where("id = ?", id).Updates(
            models.User{
                UserName: username,
                State:    state,
                Phone:    phone})

        c.JSON(http.StatusOK, gin.H{
            "code": 200,
            "msg":  "修改成功",
        })
    }

}

查找

/**
条件查询
*/

func Sel(c *gin.Context) {
    var data []models.User
    //获取路径参数
    name := c.Param("name")

    //查询数据
    mysql.DB().Where("user_name = ?", name).Find(&data)

    if len(data) == 0 {
        c.JSON(http.StatusOK, gin.H{
            "code": 400,
            "msg":  "没查询到数据",
        })
    } else {
        c.JSON(http.StatusOK, gin.H{
            "code": 200,
            "msg":  "查询成功",
            "data": data,
        })
    }
}
/**
分页查询
*/

func All(c *gin.Context) {
    var data []models.User
    pageSize, _ := strconv.Atoi(c.Query("pageSize"))
    pageNum, _ := strconv.Atoi(c.Query("pageNum"))

    if pageSize == 0 {
        pageSize = -1
    }

    if pageNum == 0 {
        pageNum = -1
    }

    offsetVal := (pageNum - 1) * pageSize
    if pageNum == -1 && pageSize == -1 {
        offsetVal = -1
    }

    //总数
    var total int64
    //查询数据
    mysql.DB().Model(data).Count(&total).Limit(pageSize).Offset(offsetVal).Find(&data)

    if len(data) == 0 {
        c.JSON(http.StatusOK, gin.H{
            "code": 400,
            "msg":  "查询不到数据",
        })
    } else {

        c.JSON(http.StatusOK, gin.H{
            "code": 200,
            "msg":  "查询成功",
            "data": gin.H{
                "list":     data,
                "total":    total,
                "pageNum":  pageNum,
                "pageSize": pageSize,
            },
        })
    }
}

上述demo完成执行入口文件 访问就ok , 这里的操作在https://learnku.com/docs/gorm/v2/create/9732 手册中都可以查询到 别前几天的操作简单更加容易上手 ,如果有什么问题希望大家私信沟通

我会把这两套代码分享给大家 https://jihulab.com/gin-curd/gin-curd-first.git ; https://jihulab.com/gin-curd/gin-curd-second.git

你可能感兴趣的:(Golang,gin)