• Gin框架结合gorm实现mysql增删改查


    1.Gin框架中mysql的连接

    安装驱动(如安装go-gorm/mysql则不需引入):

    go get github.com/go-sql-driver/mysql

    安装gorm:

    github.com地址:

    go get github.com/go-gorm/gorm
    go get github.com/go-gorm/mysql

    官方地址:

    go get gorm.io/gorm
    go get gorm.io/gorm

    go mod 依赖配置:

    go mod tidy

    根据需要创建数据库连接目录(dbtabases):

    mysql.go连接文件:

    package databases
    
    import (
        "fmt"
        "gorm.io/driver/mysql"
        "gorm.io/gorm"
    )
    
    var Eloquent *gorm.DB
    
    func init() {
        var err error
        //用户名:密码@tcp(数据库ip或域名:端口)/数据库名称?charset=数据库编码&parseTime=True&loc=Local
        dsn := "root:root@tcp(127.0.0.1:3306)/gin_test?charset=utf8&parseTime=True&loc=Local"
        Eloquent, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
        if err != nil {
            fmt.Printf("mysql connect error %v", err)
        }
        if Eloquent.Error != nil {
            fmt.Printf("database error %v", Eloquent.Error)
        }
    }

    main.go文件:

    //SetMaxIdleConns 是设置空闲时的最大连接数
    //SetMaxOpenConns 设置与数据库的最大打开连接数
    //SetConnMaxLifetime 每一个连接的生命周期等信息
    sqlDB, err := orm.Eloquent.DB()
    if err != nil {
        panic(err)
    }
    sqlDB.SetMaxIdleConns(5)
    sqlDB.SetMaxOpenConns(10)
    sqlDB.SetConnMaxLifetime(-1)
    //延时调用函数
    defer sqlDB.Close()
    //注册路由
    router := routers.RegisterRoutes()
    
    // 绑定端口是8088
    router.Run(":8088")

    2.数据表的增删改查实例:

    创建一个测试表:

    CREATE TABLE `tb_test` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
      `name` varchar(255) NOT NULL DEFAULT '' COMMENT '名称',
      `create_time` datetime NOT NULL COMMENT '创建时间',
      `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试表';

    创建一个模型目录及对应控制器/模型文件(curd方法):

    模型test.go文件:

    package models
    
    import (
        orm "gin_test/databases"
    )
    
    type TbTest struct {
        Id         int64  `gorm:"column:id;primary_key;auto_increment"`
        Name       string `gorm:"column:name;type:varchar(255);size(64);not null"`
        CreateTime string `gorm:"column:create_time;not null"`
        UpdateTime string `gorm:"column:update_time;not null"`
    }
    
    func (t *TbTest) TableName() string {
        return "tb_test"
    }
    
    func ListTest(datas []TbTest, page int) ([]TbTest, int64, error) {
        var pageSize = 2
        db := orm.Eloquent
        offset := (page - 1) * pageSize
        result := db.Order("id desc").Offset(offset).Limit(pageSize).Find(&datas)
        return datas, result.RowsAffected, result.Error
    }
    
    func CreateTest(data TbTest) (int64, error) {
        db := orm.Eloquent
        result := db.Create(&data)
        return data.Id, result.Error
    }
    
    func FindTest(id int64) (TbTest, error) {
        var model TbTest
        db := orm.Eloquent
        result := db.First(&model, id)
        return model, result.Error
    }
    
    func UpdateTest(data TbTest, id int64) (int64, error) {
        var model TbTest
        db := orm.Eloquent
        row := db.First(&model, id)
        if row.Error == nil {
            result := db.Model(&model).Updates(&data)
            return model.Id, result.Error
        }
        return 0, row.Error
    }
    
    func DeleteTest(id int64) (int64, error) {
        var model TbTest
        db := orm.Eloquent
        result := db.Delete(&model, id)
        return result.RowsAffected, result.Error
    }

    控制器test.go文件:

    package controllers
    
    import (
        "gin_test/common"
        "gin_test/models"
        "github.com/gin-gonic/gin"
        "net/http"
        "strconv"
    )
    
    // 定义接收数据的结构体
    type TestData struct {
        // binding:"required"修饰的字段,若接收为空值,则报错,是必须字段
        Id   int64  `form:"id" json:"id" uri:"id" xml:"id"`
        Name string `form:"name" json:"name" uri:"name" xml:"name"`
    }
    
    func ListTest(c *gin.Context) {
        page, _ := strconv.Atoi(c.Query("page"))
        if page == 0 {
            page = 1
        }
        var list []models.TbTest
        res, rows, err := models.ListTest(list, page)
        if err != nil {
            c.JSON(http.StatusMovedPermanently, gin.H{"code:": 1, "msg: ": err.Error()})
            return
        }
        c.JSON(http.StatusOK, gin.H{"code": 0, "list": res, "pageTotal": rows})
        return
    }
    
    func CreateTest(c *gin.Context) {
        // 声明接收的变量
        var data TestData
        // 将request的body中的数据,自动按照json格式解析到结构体
        if err := c.ShouldBindJSON(&data); err != nil {
            // 返回错误信息
            // gin.H封装了生成json数据的工具
            c.JSON(http.StatusMovedPermanently, gin.H{"code:": 1, "msg: ": err.Error()})
            return
        }
        var model models.TbTest
        var time = common.GetTimeForm(common.GetTimestamp())
        model.Name = data.Name
        model.CreateTime = time
        model.UpdateTime = time
        if _, err := models.CreateTest(model); err != nil {
            c.JSON(http.StatusMovedPermanently, gin.H{"code:": 1, "msg: ": err.Error()})
            return
        }
        c.JSON(http.StatusOK, gin.H{"code": 0, "msg": "添加成功"})
        return
    }
    
    func UpdateTest(c *gin.Context) {
        // 声明接收的变量
        var data TestData
        // 将request的body中的数据,自动按照json格式解析到结构体
        if err := c.ShouldBindJSON(&data); err != nil {
            // 返回错误信息
            // gin.H封装了生成json数据的工具
            c.JSON(http.StatusMovedPermanently, gin.H{"code:": 1, "msg: ": err.Error()})
            return
        }
        var model models.TbTest
        res, err := models.FindTest(data.Id)
        if err != nil {
            c.JSON(http.StatusMovedPermanently, gin.H{"code:": 1, "msg: ": err.Error()})
            return
        }
        model.Name = data.Name
        if _, err := models.UpdateTest(model, res.Id); err != nil {
            c.JSON(http.StatusMovedPermanently, gin.H{"code:": 1, "msg: ": err.Error()})
            return
        }
        c.JSON(http.StatusOK, gin.H{"code": 0, "msg": "更新成功"})
        return
    }
    
    func DeleteTest(c *gin.Context) {
        // 声明接收的变量
        var data TestData
        // 将request的body中的数据,自动按照json格式解析到结构体
        if err := c.ShouldBindJSON(&data); err != nil {
            // 返回错误信息
            // gin.H封装了生成json数据的工具
            c.JSON(http.StatusMovedPermanently, gin.H{"code:": 1, "msg: ": err.Error()})
            return
        }
        if _, err := models.DeleteTest(data.Id); err != nil {
            c.JSON(http.StatusMovedPermanently, gin.H{"code:": 1, "msg: ": err.Error()})
            return
        }
        c.JSON(http.StatusOK, gin.H{"code": 0, "msg": "删除成功"})
        return
    }

    路由文件router.go绑定:

    //测试-数据表增删改查
    router.GET("/test/list", controllers.ListTest)
    router.POST("/test/create", controllers.CreateTest)
    router.POST("/test/update", controllers.UpdateTest)
    router.POST("/test/delete", controllers.DeleteTest)

    数据测试列表:

    Get: http://127.0.0.1:8088/test/list?page=1

    数据测试添加:

    Post: http://127.0.0.1:8088/test/create

    数据测试更新:

    Post: http://127.0.0.1:8088/test/update

    数据测试删除:

    Post: http://127.0.0.1:8088/test/update

    数据表记录:

    到此结束,这就是一个简单的curd使用。

    进击的qing
  • 相关阅读:
    Shrink / VACUUM Database Sample Code C#
    (转)Export .NET MSChart to Excel/PDF Using Report Viewer 2010
    VS2010中使用《WeifenLuo.WinFormsUI.Docking.dll》,类型 Universe 无法解析程序集
    Binding to a ComboBox using a DataTable and Linq
    elementui 点击Switch开关弹出对话框确认后再改变switch开关状态
    c# 获取ip和mac
    mysql 允许ip访问
    jdk下载
    vue video 动态地址 不能自动播放
    c# 取右侧固定N个字符,不足用0填充
  • 原文地址:https://www.cnblogs.com/qingfj/p/15000286.html
Copyright © 2020-2023  润新知