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

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 表:

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

一般情况下表名会显示复数 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增删改查内容请搜索恩蓝小号以前的文章或继续浏览下面的相关文章希望大家以后多多支持恩蓝小号!

原创文章,作者:LHYDB,如若转载,请注明出处:https://www.wangzhanshi.com/n/6152.html

(0)
LHYDB的头像LHYDB
上一篇 2024年12月29日 12:46:24
下一篇 2024年12月29日 12:46:34

相关推荐

  • 学习GO编程必备知识汇总

    如果你想开始学习GO语法前,请先背熟下述4点: 1. 环境变量: 使用go env查看环境变量 GOARCH/GOHOSTARCH: 体系架构, amd64或386 GOOS/GO…

    Golang 2024年12月29日
  • go语言中的log 包示例详解

    Go语言的log包提供了用于记录日志的基本功能。相比fmt包,log包增加了时间戳、日志级别等日志管理功能,非常适合用于调试和记录运行信息。下面是对log包的详细说明,以及它与fm…

    Golang 2024年12月17日
  • golang标准库time时间包的使用

    time包 时间和日期是我们编程中经常会用到的,本文主要介绍了 Go 语言内置的 time 包的基本用法。 time 包提供了一些关于时间显示和测量用的函数。 time 包中日历的…

    2024年12月26日
  • 使用Gin框架处理表单数据的操作步骤

    1. 表单处理的基础知识 表单处理包括从客户端获取用户提交的数据,将数据绑定到结构体,验证其有效性,并根据结果执行相关操作。主要流程如下: 用户提交表单:通过 HTTP …

    Golang 2024年12月17日
  • GoLang socket网络编程传输数据包时进行长度校验的方法

    正常来说,我们发送和接收数据时,是像下面这样的: // 发送端 func main() { conn, _ := net.Dial(“tcp”, “127.0.0.1:8889”)…

    2024年12月17日
  • golang flag介绍和使用示例

    在 Go 语言中,flag 包用于解析命令行标志。它提供了一种简单的方法来处理程序的输入参数。以下是对 flag 包的介绍和使用示例。 1. 基本概念 标志(Flag):命令行参数…

    Golang 2024年12月17日
  • GO语言实现AES-CFB加密的操作方法

    这里为了使用方便,实现代码不作为一个函数而是作为一个包,这样在后面的代码中也可以进行复用。 包和导入 package encrypt import ( “crypto/aes” /…

    Golang 2024年12月17日
  • golang类型断言的实现示例

    在 Go 语言中,类型断言是一种机制,用于从接口类型获取其具体类型的值。这对于处理通过接口传递的值非常有用。以下是类型断言的基本概念、语法和示例。 1. 基本语法 类型断言的语法如…

    Golang 2024年12月17日
  • 重学Go语言之基础数据类型详解

    前言 Go语言有非常强大的数据类型系统,其支持的数据类型大体上可分为四类:基础数据类型、引用数据类型、接口类型、复合类型。 基础数据类型有: 布尔型(bool) 整型(int) 浮…

    Golang 2024年12月29日
  • golang读取yaml配置文件的方法实现

    Viper Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持以下特性: 设置默认值 从JSON、TOML…

    Golang 2024年12月17日

发表回复

登录后才能评论