最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Gin+Gorm實現(xiàn)增刪改查的示例代碼

 更新時間:2024年12月04日 09:16:03   作者:愛吃魚的cl  
本文介紹了如何使用Gin和Gorm框架實現(xiàn)一個簡單的增刪改查(CRUD)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1.安裝 Gin 和 Gorm

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

新建項目,main 函數(shù)import 他們的包

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

2.連接MySQL

var DB *gorm.DB // 全局DB,方便后續(xù)擴展其他包調(diào)用

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 之前的數(shù)據(jù)庫不支持
   DontSupportRenameIndex: true, // 重命名索引時采用刪除并新建的方式,MySQL 5.7 之前的數(shù)據(jù)庫和 MariaDB 不支持重命名索引
   DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的數(shù)據(jù)庫和 MariaDB 不支持重命名列
   SkipInitializeWithVersion: false, // 根據(jù)當前 MySQL 版本自動配置
}), &gorm.Config{})

3.聲明模型并綁定

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

如想在數(shù)據(jù)庫表中增加 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:設(shè)置主鍵
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt *time.Time
}

接下來最重要的一步,一定要綁定模型:

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

后續(xù)執(zhí)行綁定模型后會在你的 MySQL 數(shù)據(jù)庫中生成一張 Todo 表:

todo_table.jpg

一般情況下表名會顯示復(fù)數(shù) Todos,改為單數(shù)的話要在 &gorm.Config 中指定啟用單數(shù) SingularTable 為 true:

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

4.結(jié)合 Gin 完成增刪改查

流程主要分為三步:

  • 從請求中取出數(shù)據(jù)
  • 操作數(shù)據(jù)庫
  • 返回響應(yīng)

完整代碼:

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() {
    // 連接數(shù)據(jù)庫
    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.從請求中取出數(shù)據(jù)
            var todo Todo
            if err = c.ShouldBindJSON(&todo); err != nil {
                c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            }
            // 2.存入數(shù)據(jù)庫
            if err = DB.Create(&todo).Error; err != nil {
                c.JSON(http.StatusOK, gin.H{"error": err.Error()})
                return
            } else {
                // 3.返回響應(yīng)
                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
    }
}

執(zhí)行 go run main.go 項目啟動在8080端口。

到此這篇關(guān)于Gin+Gorm實現(xiàn)增刪改查的示例代碼的文章就介紹到這了,更多相關(guān)Gin Gorm增刪改查內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go操作各大消息隊列教程(RabbitMQ、Kafka)

    Go操作各大消息隊列教程(RabbitMQ、Kafka)

    消息隊列是一種異步的服務(wù)間通信方式,適用于無服務(wù)器和微服務(wù)架構(gòu),本文主要介紹了Go操作各大消息隊列教程(RabbitMQ、Kafka),需要的朋友可以了解一下
    2024-02-02
  • Golang 語言極簡類型轉(zhuǎn)換庫cast的使用詳解

    Golang 語言極簡類型轉(zhuǎn)換庫cast的使用詳解

    本文我們通過 cast.ToString() 函數(shù)的使用,簡單介紹了cast 的使用方法,除此之外,它還支持很多其他類型,在這沒有多多介紹,對Golang 類型轉(zhuǎn)換庫 cast相關(guān)知識感興趣的朋友一起看看吧
    2021-11-11
  • Go語言dolphinscheduler任務(wù)調(diào)度處理

    Go語言dolphinscheduler任務(wù)調(diào)度處理

    這篇文章主要為大家介紹了Go語言dolphinscheduler任務(wù)調(diào)度處理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 淺析Go語言如何避免數(shù)據(jù)競爭Data?Race和競態(tài)條件Race?Condition

    淺析Go語言如何避免數(shù)據(jù)競爭Data?Race和競態(tài)條件Race?Condition

    在并發(fā)編程中,數(shù)據(jù)競爭?(Data?Race)?和?競態(tài)條件?(Race?Condition)?是兩個常見的問題,本文將簡單介紹一下二者如何避免,有需要的可以了解下
    2025-01-01
  • 一文了解Go 并發(fā)與并行

    一文了解Go 并發(fā)與并行

    并發(fā)性和并行性是是兩個既有聯(lián)系又有所區(qū)別的概念,本文主要介紹了Go并發(fā)與并行,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • 詳解MongoDB?Go?Driver如何記錄日志

    詳解MongoDB?Go?Driver如何記錄日志

    這篇文章主要為大家介紹了MongoDB?Go?Driver如何記錄日志詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • go?generate代碼自動生成指南

    go?generate代碼自動生成指南

    這篇文章主要介紹了go?generate代碼自動生成指南,本文將探討?go?generate?命令的使用方法、原理以及一些實際應(yīng)用場景,希望讀者能夠更好地理解和運用這個強大的工具
    2024-01-01
  • Go中標準庫fmt包的使用小結(jié)

    Go中標準庫fmt包的使用小結(jié)

    fmt包是Go語言處理輸入輸出的核心庫,提供Print/Scan系列函數(shù)及多樣格式化動詞(如%v、%d、%s等),支持字符串格式化、掃描、自定義輸出格式及錯誤處理,廣泛用于數(shù)據(jù)格式化與輸出控制,下面就來詳細的介紹一下
    2025-09-09
  • golang-gorm自動建表問題

    golang-gorm自動建表問題

    這篇文章主要介紹了golang-gorm自動建表問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 使用Go語言編譯Linux平臺可執(zhí)行文件的完整指南

    使用Go語言編譯Linux平臺可執(zhí)行文件的完整指南

    在Go語言開發(fā)中,跨平臺編譯是一個非常重要的功能,本文將詳細介紹如何使用Go語言將項目編譯為Linux平臺的可執(zhí)行文件,特別是針對國內(nèi)開發(fā)者的優(yōu)化配置,需要的朋友可以參考下
    2025-08-08

最新評論

齐齐哈尔市| 新乡市| 新巴尔虎左旗| 神木县| 木里| 道孚县| 隆昌县| 重庆市| 都兰县| 特克斯县| 新营市| 胶州市| 洮南市| 陇南市| 兴山县| 昌吉市| 当涂县| 泸溪县| 西乌| 黔江区| 廊坊市| 松江区| 南丹县| 天台县| 镇赉县| 马边| 洞口县| 清远市| 天等县| 凉城县| 临沭县| 繁昌县| 桦川县| 孙吴县| 翁源县| 郑州市| 西宁市| 托克托县| 青河县| 额济纳旗| 竹北市|