Go使用Gin+mysql實現(xiàn)增刪改查的詳細實例
0.前置知識
- Go中的struct。
- mysql、Gin框架。
- Web基礎(chǔ)。
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é)
到此這篇關(guān)于Go使用Gin+mysql實現(xiàn)增刪改查的文章就介紹到這了,更多相關(guān)Go Gin+mysql增刪改查內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VsCode下開發(fā)Go語言的環(huán)境配置超詳細圖文詳解
vscode是一款跨平臺、輕量級、插件多的開源IDE,在vscode不僅可以配置C/C++、Python、R、Ruby等語言的環(huán)境,還可以配置Go語言的環(huán)境,下面這篇文章主要給大家介紹了關(guān)于VsCode下開發(fā)Go語言的環(huán)境配置,需要的朋友可以參考下2024-03-03
Windows下在CMD下執(zhí)行Go出現(xiàn)中文亂碼的解決方法
在cmd下運行g(shù)o程序或者是GOLAND的Terminal下運行g(shù)o程序會出現(xiàn)中文亂碼的情況。本文就詳細的介紹下解決方法,具有一定的參考價值,感興趣的可以了解一下2021-12-12
Golang小數(shù)操作指南之判斷小數(shù)點位數(shù)與四舍五入
這篇文章主要給大家介紹了關(guān)于Golang小數(shù)操作指南之判斷小數(shù)點位數(shù)與四舍五入的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2022-03-03

