欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go使用Gin+mysql實現(xiàn)增刪改查的詳細實例

 更新時間:2022年12月02日 10:43:05   作者:Harris-H  
golang本身沒有提供連接mysql的驅(qū)動,但是定義了標準接口供第三方開發(fā)驅(qū)動,下面這篇文章主要給大家介紹了關于Go使用Gin+mysql實現(xiàn)增刪改查的相關資料,需要的朋友可以參考下

0.前置知識

  • Go中的struct。
  • mysql、Gin框架。
  • Web基礎。

1.架構(gòu)

使用mysql作為數(shù)據(jù)庫,Gin作為Web框架。

2.功能模塊

1.自定義Person結(jié)構(gòu)體

2.實現(xiàn)對Person的增刪改查。

  • 根據(jù)id查詢或查詢所有
  • 插入
  • 修改
  • 刪除

3.實現(xiàn)流程

1.建立數(shù)據(jù)庫連接池db,然后連接指定的數(shù)據(jù)庫。

2.編寫Web接口(增刪改查)

3.通過postman測試或者直接網(wǎng)頁請求測試。

4.代碼

package main

// 導入模塊
import (
	"bytes"
	"database/sql"
	"fmt"
	"github.com/gin-gonic/gin"
	_ "github.com/go-sql-driver/mysql"
	"log"
	"net/http"
	"strconv"
)


var db *sql.DB

// Person 自定義Person類
type Person struct {
	Id        int    `json:"id"`
	FirstName string `json:"first_name" form:"first_name"`
	LastName  string `json:"last_name" form:"last_name"`
}

func (p *Person) get(db *sql.DB) (person Person, err error) {
	row := db.QueryRow("SELECT id,first_name,last_name from person where id=?", p.Id)
	err = row.Scan(&person.Id, &person.FirstName, &person.LastName)
	if err != nil {
		return
	}
	return
}

func (p *Person) getAll(db *sql.DB) (persons []Person, err error) {
	rows, err := db.Query("select id,first_name,last_name from person")
	fmt.Println(rows)
	if err != nil {
		return
	}
	for rows.Next() {
		var person Person
		rows.Scan(&person.Id, &person.FirstName, &person.LastName)
		persons = append(persons, person)
	}
	defer rows.Close()
	return
}

func (p *Person) add(db *sql.DB) (Id int, err error) {
	stmt, err := db.Prepare("INSERT into person(first_name,last_name) values (?,?)")
	if err != nil {
		return
	}
	rs, err := stmt.Exec(p.FirstName, p.LastName)
	if err != nil {
		return
	}
	id, err := rs.LastInsertId()
	if err != nil {
		log.Fatalln(err)
	}
	Id = int(id)
	defer stmt.Close()
	return
}

func (p *Person) update(db *sql.DB) (rows int, err error) {
	stmt, err := db.Prepare("update person set first_name=?,last_name=? where id=?")
	if err != nil {
		log.Fatalln(err)
	}
	rs, err := stmt.Exec(p.FirstName, p.LastName, p.Id)
	if err != nil {
		log.Fatalln(err)
	}
	row, err := rs.RowsAffected()
	if err != nil {
		log.Fatalln(err)
	}
	rows = int(row)
	defer stmt.Close()
	return
}

func (p *Person) del(db *sql.DB) (rows int, err error) {
	stmt, err := db.Prepare("delete from person where id=?")
	if err != nil {
		log.Fatalln(err)
	}
	rs, err := stmt.Exec(p.Id)
	if err != nil {
		log.Fatalln(err)
	}
	row, err := rs.RowsAffected()
	if err != nil {
		log.Fatalln(err)
	}
	rows = int(row)
	defer stmt.Close()
	return
}

func test(db *sql.DB) {
	rows, err := db.Query("select * from person")
	if err != nil {
		return
	}
	defer rows.Close()
	var persons []Person
	for rows.Next() {
		var person Person
		rows.Scan(&person.Id, &person.FirstName, &person.LastName)
		persons = append(persons, person)
	}
	fmt.Println(persons)
}
func main() {
	var err error
	db, err := sql.Open("mysql", "root:xxxxx@tcp(127.0.0.1:3306)/go_project01?parseTime=true")
	if err != nil {
		log.Fatal(err.Error())
	}
	//defer db.Close()
	err = db.Ping()
	if err != nil {
		log.Fatal(err.Error())
	}
	//test(db)
	//創(chuàng)建路由引擎
	router := gin.Default()

	//查詢,返回所有對象和對象個數(shù)
	router.GET("/persons", func(context *gin.Context) {
		p := Person{}
		persons, err := p.getAll(db)
		if err != nil {
			log.Fatalln(err)
		}
		context.JSON(http.StatusOK, gin.H{
			"result": persons,
			"count":  len(persons),
		})
	})
	//根據(jù)id查詢
	router.GET("/person/:id", func(context *gin.Context) {
		var result gin.H
		id := context.Param("id")

		Id, err := strconv.Atoi(id)
		if err != nil {
			log.Fatalln(err)
		}
		p := Person{
			Id: Id,
		}
		person, err := p.get(db)
		if err != nil {
			result = gin.H{
				"result": nil,
				"count":  0,
			}
		} else {
			result = gin.H{
				"result": person,
				"count":  1,
			}
		}
		context.JSON(http.StatusOK, result)
	})
	//創(chuàng)建person
	router.POST("/person", func(context *gin.Context) {
		var p Person
		err := context.Bind(&p)
		if err != nil {
			log.Fatalln(err)
		}

		Id, err := p.add(db)
		if err != nil {
			log.Fatalln(err)
		}
		fmt.Println(Id)
		name := p.FirstName + " " + p.LastName
		context.JSON(http.StatusOK, gin.H{
			"message": fmt.Sprintf(" %s 成功創(chuàng)建", name),
		})
	})
	//更新update
	router.PUT("/person/:id", func(context *gin.Context) {
		var (
			p      Person
			buffer bytes.Buffer
		)

		id := context.Param("id")
		Id, err := strconv.Atoi(id)
		if err != nil {
			log.Fatalln(err)
		}
		err = context.Bind(&p)
		if err != nil {
			log.Fatalln(err)
		}
		p.Id = Id
		rows, err := p.update(db)
		if err != nil {
			log.Fatalln(err)
		}
		fmt.Println(rows)
		buffer.WriteString(p.FirstName)
		buffer.WriteString(" ")
		buffer.WriteString(p.LastName)
		name := buffer.String()

		context.JSON(http.StatusOK, gin.H{
			"message": fmt.Sprintf("成功更新到%s", name),
		})
	})
	//刪除person
	router.DELETE("/person/:id", func(context *gin.Context) {
		id := context.Param("id")

		Id, err := strconv.ParseInt(id, 10, 10)
		if err != nil {
			log.Fatalln(err)
		}
		p := Person{Id: int(Id)}
		rows, err := p.del(db)
		if err != nil {
			log.Fatalln(err)
		}
		fmt.Println("delete rows: ", rows)

		context.JSON(http.StatusOK, gin.H{
			"message": fmt.Sprintf("成功刪除用戶:%s", id),
		})
	})
	router.Run(":8080")
}

5.結(jié)果

總結(jié) 

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

相關文章

  • golang進程在docker中OOM后hang住問題解析

    golang進程在docker中OOM后hang住問題解析

    這篇文章主要介紹了golang進程在docker中OOM后hang住問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 基于Go+WebSocket實現(xiàn)實時通信功能

    基于Go+WebSocket實現(xiàn)實時通信功能

    在互聯(lián)網(wǎng)應用程序中,實時通信是一種非常重要的功能,WebSocket 是一種基于 TCP 的協(xié)議,它允許客戶端和服務器之間進行雙向通信,本文將介紹如何使用 Golang 創(chuàng)建單獨的 WebSocket 會話,以實現(xiàn)實時通信功能,需要的朋友可以參考下
    2023-10-10
  • Go語言中的原子操作使用詳解

    Go語言中的原子操作使用詳解

    這篇文章主要介紹了Go語言中的原子操作使用詳解的相關資料,需要的朋友可以參考下
    2023-08-08
  • Go語言泛型打造優(yōu)雅的切片工具庫

    Go語言泛型打造優(yōu)雅的切片工具庫

    泛型是一種編程范式,允許開發(fā)者在編寫代碼時定義通用的類型參數(shù),而不是具體的類型,本文將使用泛型實現(xiàn)打造優(yōu)雅的切片工具庫,希望對大家有所幫助
    2025-02-02
  • Go語言的反射reflect使用大全

    Go語言的反射reflect使用大全

    Go語言中reflect包提供了運行時反射的功能,本文主要介紹了Go語言的反射reflect使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-08-08
  • Go語言Slice切片底層的實現(xiàn)

    Go語言Slice切片底層的實現(xiàn)

    本文主要介紹了Go語言Slice切片底層的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-04-04
  • Golang 實現(xiàn)簡單隨機負載均衡

    Golang 實現(xiàn)簡單隨機負載均衡

    均衡算法又分為 隨機,輪詢,加權(quán)輪詢,哈希,而隨機負載均衡算法就是本文的重點,需要的朋友們下面隨著小編來一起學習學習吧
    2021-06-06
  • Go語言映射內(nèi)部實現(xiàn)及基礎功能實戰(zhàn)

    Go語言映射內(nèi)部實現(xiàn)及基礎功能實戰(zhàn)

    這篇文章主要為大家介紹了Go語言映射的內(nèi)部實現(xiàn)和基礎功能實戰(zhàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>
    2022-03-03
  • 解析Golang中的GoPath和GoModule

    解析Golang中的GoPath和GoModule

    在Golang中,有兩個概念非常容易弄錯,第一個就是GoPath,第二個則是GoModule,很多初學者不清楚這兩者之間的關系,也就難以清晰地了解項目的整體結(jié)構(gòu),今天通過本文給大家介紹下Golang中的GoPath和GoModule相關知識,感興趣的朋友一起看看吧
    2022-02-02
  • Go?編程復雜數(shù)據(jù)類型?Map

    Go?編程復雜數(shù)據(jù)類型?Map

    這篇文章主要介紹了Go編程復雜數(shù)據(jù)類型Map,Go中的Map是一組無需的K-V類型的數(shù)據(jù),與Python中的字典Dict和Java中的HashMap結(jié)構(gòu)類似。未被初始化的Map為nil
    2022-08-08

最新評論