Gin+Gorm实现增删改查的示例代码

 更新时间:2024年12月04日 09:16:03   作者:爱吃鱼的cl  
本文介绍了如何使用Gin和Gorm框架实现一个简单的增删改查(CRUD)示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1.安装 Gin 和 Gorm

go get -u github.com/gin-gonic/gin
go get -u gorm.io/gorm

新建项目,main 函数import 他们的包

"github.com/gin-gonic/gin"
"gorm.io/driver/mysql"
"gorm.io/gorm"

2.连接MySQL

var DB *gorm.DB // 全局DB,方便后续扩展其他包调用

func initMySQL() (err error) {
    dsn := "root:root@tcp(127.0.0.1:13306)/bubble?charset=utf8mb4&parseTime=True&loc=Local"
    DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
        NamingStrategy: schema.NamingStrategy{
            SingularTable: true,
        },
    })
    if err != nil {
        return
    }
    return nil
}

dsn 处换成自己的 MySQL 配置信息。
高级配置:参考 https://gorm.io/zh_CN/docs/connecting_to_the_database.html

db, err := gorm.Open(mysql.New(mysql.Config{
   DSN: "gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local", // DSN data source name
   DefaultStringSize: 256, // string 类型字段的默认长度
   DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
   DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
   DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
   SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
}), &gorm.Config{})

3.声明模型并绑定

type Todo struct {
    ID     int    `json:"id"`
    Title  string `json:"title"`
    Status bool   `json:"status"`
}

如想在数据库表中增加 CreatedAt , UpdatedAt 和 DeletedAt 字段,可在 Todo 模型中引入 gorm.Model 字段:

type Todo struct {
    gorm.Model
    ID     int    `json:"id"`
    Title  string `json:"title"`
    Status bool   `json:"status"`
}

gorm.Model 定义如下:

type Model struct {
  ID        uint `gorm:"primary_key"`//primary_key:设置主键
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt *time.Time
}

接下来最重要的一步,一定要绑定模型:

// 模型绑定
err = DB.AutoMigrate(&Todo{})
if err != nil {
    return
}

后续执行绑定模型后会在你的 MySQL 数据库中生成一张 Todo 表:

todo_table.jpg

一般情况下表名会显示复数 Todos,改为单数的话要在 &gorm.Config 中指定启用单数 SingularTable 为 true:

 DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
        NamingStrategy: schema.NamingStrategy{
            SingularTable: true,
        },
    })

4.结合 Gin 完成增删改查

流程主要分为三步:

  • 从请求中取出数据
  • 操作数据库
  • 返回响应

完整代码:

package main

import (
    "github.com/gin-gonic/gin"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "gorm.io/gorm/schema"
    "net/http"
)

var DB *gorm.DB

func initMySQL() (err error) {
    dsn := "root:root@tcp(127.0.0.1:13306)/bubble?charset=utf8mb4&parseTime=True&loc=Local"
    DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
        NamingStrategy: schema.NamingStrategy{
            SingularTable: true,
        },
    })
    if err != nil {
        return
    }
    return nil
}

type Todo struct {
    ID     int    `json:"id"`
    Title  string `json:"title"`
    Status bool   `json:"status"`
}

func main() {
    // 连接数据库
    err := initMySQL()
    if err != nil {
        panic(err)
    }
    // 模型绑定
    err = DB.AutoMigrate(&Todo{})
    if err != nil {
        return
    }

    r := gin.Default()

    v1Group := r.Group("/v1")
    {
        // 添加
        v1Group.POST("/todo", func(c *gin.Context) {
            // 1.从请求中取出数据
            var todo Todo
            if err = c.ShouldBindJSON(&todo); err != nil {
                c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            }
            // 2.存入数据库
            if err = DB.Create(&todo).Error; err != nil {
                c.JSON(http.StatusOK, gin.H{"error": err.Error()})
                return
            } else {
                // 3.返回响应
                c.JSON(http.StatusOK, gin.H{"data": todo})
            }

        })
        // 查看所有的待办事项
        v1Group.GET("/todo", func(c *gin.Context) {
            var todoList []Todo
            if err = DB.Find(&todoList).Error; err != nil {
                c.JSON(http.StatusOK, gin.H{"error": err.Error()})
                return
            } else {
                c.JSON(http.StatusOK, gin.H{"data": todoList})
            }
        })
        // 查看某个待办事项
        v1Group.GET("/todo/:id", func(c *gin.Context) {
            var todo Todo
            if err = DB.First(&todo, c.Param("id")).Error; err != nil {
                c.JSON(http.StatusOK, gin.H{"error": err.Error()})
                return
            } else {
                c.JSON(http.StatusOK, gin.H{"data": todo})
            }
        })
        // 更新某一个待办事项
        v1Group.PUT("/todo/:id", func(c *gin.Context) {
            id, ok := c.Params.Get("id")
            if !ok {
                c.JSON(http.StatusOK, gin.H{"error": "无效的id"})
            }
            var todo Todo
            if err = DB.Where("id = ?", id).First(&todo).Error; err != nil {
                c.JSON(http.StatusOK, gin.H{"error": err.Error()})
                return
            }
            c.ShouldBindJSON(&todo)
            if err = DB.Save(&todo).Error; err != nil {
                c.JSON(http.StatusOK, gin.H{"error": err.Error()})
                return
            } else {
                c.JSON(http.StatusOK, gin.H{"data": todo})
            }
        })
        // 删除某个待办事项
        v1Group.DELETE("/todo/:id", func(c *gin.Context) {
            var todo Todo
            id, ok := c.Params.Get("id")
            if !ok {
                c.JSON(http.StatusOK, gin.H{"error": "无效的id"})
            }
            if err = DB.Where("id = ?", id).Delete(&Todo{}).Error; err != nil {
                c.JSON(http.StatusOK, gin.H{"error": err.Error()})
                return
            } else {
                c.JSON(http.StatusOK, gin.H{"data": todo})
            }

        })
    }

    err = r.Run(":8080")
    if err != nil {
        return
    }
}

执行 go run main.go 项目启动在8080端口。

到此这篇关于Gin+Gorm实现增删改查的示例代码的文章就介绍到这了,更多相关Gin Gorm增删改查内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go中Context使用源码解析

    Go中Context使用源码解析

    这篇文章主要为大家介绍了Go中Context使用源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • golang查看CPU使用率与内存的方法详解

    golang查看CPU使用率与内存的方法详解

    这篇文章主要给大家介绍了golang查看CPU使用率与内存的方法,以及拓展介绍源码里//go:指令,文中有详细的代码示例以及图文介绍,需要的朋友可以参考下
    2023-10-10
  • 解读golang中的const常量和iota

    解读golang中的const常量和iota

    这篇文章主要介绍了golang中的const常量和iota,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Go语言单元测试模拟服务请求和接口返回

    Go语言单元测试模拟服务请求和接口返回

    这篇文章主要为大家介绍了Go语言单元测试模拟服务请求和接口返回示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Golang实现smtp邮件发送的示例代码

    Golang实现smtp邮件发送的示例代码

    这篇文章主要为大家详细介绍了Golang实现smtp邮件发送的相关知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Golang之defer 延迟调用操作

    Golang之defer 延迟调用操作

    这篇文章主要介绍了Golang之defer 延迟调用操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据的思路详解

    Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据的思路详解

    Stream 的实现思想就是将数据处理流程抽象成了一个数据流,每次加工后返回一个新的流供使用。这篇文章主要介绍了Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据,需要的朋友可以参考下
    2022-01-01
  • golang如何通过type定义函数类型

    golang如何通过type定义函数类型

    这篇文章主要介绍了golang如何通过type定义函数类型问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 十个Go map面试常考问题合集

    十个Go map面试常考问题合集

    go面试中,map相关知识点问的比较多,这篇文章主要为大家整理归纳了10个常考的问题,文中的示例代码讲解详细,希望对大家有一定的帮助
    2023-07-07
  • Go模板后端渲染时vue单页面冲突

    Go模板后端渲染时vue单页面冲突

    go后端模版语法是通过 {{}} ,vue也是通过双花括号来渲染的,如果使用go渲染vue的html页面的时候就会报错,本文主要介绍了Go模板后端渲染时vue单页面冲突,感兴趣的可以了解一下
    2024-01-01

最新评论