亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

0.前置知識(shí)

  • Go中的struct。
  • mysql、Gin框架。
  • Web基礎(chǔ)。

1.架構(gòu)

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

2.功能模塊

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

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

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

3.實(shí)現(xiàn)流程

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

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

3.通過(guò)postman測(cè)試或者直接網(wǎng)頁(yè)請(qǐng)求測(cè)試。

4.代碼

package main

// 導(dǎo)入模塊
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()

	//查詢,返回所有對(duì)象和對(duì)象個(gè)數(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é) 

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

相關(guān)文章

  • Go基礎(chǔ)系列:Go切片(分片)slice詳解

    Go基礎(chǔ)系列:Go切片(分片)slice詳解

    這篇文章主要介紹了Go語(yǔ)言中的切片(分片)slice詳細(xì)說(shuō)明?,需要的朋友可以參考下
    2022-04-04
  • GoLang OS包以及File類型詳細(xì)講解

    GoLang OS包以及File類型詳細(xì)講解

    go中對(duì)文件和目錄的操作主要集中在os包中,下面對(duì)go中用到的對(duì)文件和目錄的操作,做一個(gè)總結(jié)筆記。在go中的文件和目錄涉及到兩種類型,一個(gè)是type File struct,另一個(gè)是type Fileinfo interface
    2023-03-03
  • Redis?BloomFilter布隆過(guò)濾器原理與實(shí)現(xiàn)

    Redis?BloomFilter布隆過(guò)濾器原理與實(shí)現(xiàn)

    你在開發(fā)或者面試過(guò)程中,有沒有遇到過(guò)?海量數(shù)據(jù)需要查重,緩存穿透怎么避免等等這樣的問(wèn)題呢?下面這個(gè)東西超棒,好好了解下,面試過(guò)關(guān)斬將,凸顯你的不一樣
    2022-10-10
  • Go語(yǔ)言的IO庫(kù)那么多糾結(jié)該如何選擇

    Go語(yǔ)言的IO庫(kù)那么多糾結(jié)該如何選擇

    在Go語(yǔ)言中涉及 I/O 操作的內(nèi)置庫(kù)有很多種,比如: io 庫(kù), os 庫(kù), ioutil 庫(kù), bufio 庫(kù), bytes 庫(kù), strings 庫(kù)等等。擁有這么多內(nèi)置庫(kù)是好事,但是具體到涉及 I/O 的場(chǎng)景我們應(yīng)該選擇哪個(gè)庫(kù)呢,帶著這個(gè)問(wèn)題一起通過(guò)本文學(xué)習(xí)下吧
    2021-06-06
  • 使用Go進(jìn)行單元測(cè)試的實(shí)現(xiàn)

    使用Go進(jìn)行單元測(cè)試的實(shí)現(xiàn)

    這篇文章主要介紹了使用Go進(jìn)行單元測(cè)試的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 利用golang和shell計(jì)算一個(gè)字符串的md5值

    利用golang和shell計(jì)算一個(gè)字符串的md5值

    這篇文章主要介紹了如何利用golang和shell計(jì)算一個(gè)字符串的md5值,我們先用shell來(lái)計(jì)算一下,再去判斷golang計(jì)算的md5值是否正確,文中有詳細(xì)的圖文介紹,需要的朋友可以參考下
    2024-03-03
  • Go整合captcha實(shí)現(xiàn)驗(yàn)證碼功能

    Go整合captcha實(shí)現(xiàn)驗(yàn)證碼功能

    最近在使用Go語(yǔ)言搞一個(gè)用戶登錄&注冊(cè)的功能,我們油然會(huì)產(chǎn)生一種增加驗(yàn)證碼的想法。后來(lái)在GitHub上找到了這個(gè)名叫captcha的插件,于是就利用文檔進(jìn)行了初步的學(xué)習(xí),并融入到自己的項(xiàng)目中,整個(gè)過(guò)程下來(lái)感覺這個(gè)插件的設(shè)計(jì)非常巧妙
    2023-03-03
  • Go語(yǔ)言面試題之select和channel的用法

    Go語(yǔ)言面試題之select和channel的用法

    金九銀十面試季到了(PS:貌似今年一年都是面試季),就業(yè)環(huán)境很差,導(dǎo)致從業(yè)人員不得不卷。本文將重點(diǎn)講解一下Go面試進(jìn)階知識(shí)點(diǎn)之select和channel,需要的可以參考一下
    2022-09-09
  • go語(yǔ)言生成隨機(jī)數(shù)和隨機(jī)字符串的實(shí)現(xiàn)方法

    go語(yǔ)言生成隨機(jī)數(shù)和隨機(jī)字符串的實(shí)現(xiàn)方法

    隨機(jī)數(shù)在很多時(shí)候都可以用到,尤其是登錄時(shí),本文就詳細(xì)的介紹一下go語(yǔ)言生成隨機(jī)數(shù)和隨機(jī)字符串的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-12-12
  • Go語(yǔ)言Gin處理響應(yīng)方式詳解

    Go語(yǔ)言Gin處理響應(yīng)方式詳解

    gin框架封裝了常用的數(shù)據(jù)格式方法響應(yīng)于客戶端,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言Gin處理響應(yīng)方式的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01

最新評(píng)論