Go使用Gin写一个对MySQL的增删改查服务

首先用SQL创建一个包含id、name属性的users表

sql 复制代码
create table users
(
    id   int auto_increment
        primary key,
    name varchar(255) null
);

查询所有用户信息:

Go 复制代码
func queryData(db *sql.DB, w http.ResponseWriter) {
	rows, err := db.Query("SELECT * FROM users")
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	defer rows.Close()
	var users []struct {
		ID   int    `json:"id"`
		Name string `json:"name"`
	}
	for rows.Next() {
		var id int
		var name string
		err := rows.Scan(&id, &name)
		if err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}
		users = append(users, struct {
			ID   int    `json:"id"`
			Name string `json:"name"`
		}{id, name})
	}
	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(users)
}

根据姓名插入一个用户信息

sql 复制代码
func insertData(db *sql.DB, name string, w http.ResponseWriter) {
	stmt, err := db.Prepare("INSERT INTO users(name) VALUES(?)")
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	defer stmt.Close()
	res, err := stmt.Exec(name)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	id, _ := res.LastInsertId()
	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(map[string]int64{"id": id})
}

根据id删除一个用户信息

Go 复制代码
func deleteData(db *sql.DB, id int, w http.ResponseWriter) {
	stmt, err := db.Prepare("DELETE FROM users WHERE id=?")
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	defer stmt.Close()
	res, err := stmt.Exec(id)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	affected, _ := res.RowsAffected()
	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(map[string]int64{"deleted": affected})
}

三个方法整合一起放到main.go文件里

Go 复制代码
package main

import (
	"database/sql"
	"encoding/json"
	"log"
	"net/http"
	"strconv"

	_ "github.com/go-sql-driver/mysql"
	"github.com/gorilla/mux"
)

func main() {
	db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test_go")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	r := mux.NewRouter()
	r.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {
		switch r.Method {
		case http.MethodGet:
			queryData(db, w)
		case http.MethodPost:
			var user struct{ Name string }
			if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
				http.Error(w, err.Error(), http.StatusBadRequest)
				return
			}
			insertData(db, user.Name, w)
		}
	}).Methods("GET", "POST")

	r.HandleFunc("/insert", func(w http.ResponseWriter, r *http.Request) {
		if r.Method != http.MethodPost {
			http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
			return
		}
		var user struct{ Name string }
		if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
			http.Error(w, err.Error(), http.StatusBadRequest)
			return
		}
		insertData(db, user.Name, w)
	}).Methods("POST")

	r.HandleFunc("/users/{id}", func(w http.ResponseWriter, r *http.Request) {
		vars := mux.Vars(r)
		idStr := vars["id"]
		id, err := strconv.Atoi(idStr)
		if err != nil {
			http.Error(w, "Invalid ID", http.StatusBadRequest)
			return
		}
		deleteData(db, id, w)
	}).Methods("DELETE")

	log.Println("Server running at http://localhost:8083")
	log.Fatal(http.ListenAndServe(":8083", r))
}

func queryData(db *sql.DB, w http.ResponseWriter) {
	rows, err := db.Query("SELECT * FROM users")
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	defer rows.Close()
	var users []struct {
		ID   int    `json:"id"`
		Name string `json:"name"`
	}
	for rows.Next() {
		var id int
		var name string
		err := rows.Scan(&id, &name)
		if err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}
		users = append(users, struct {
			ID   int    `json:"id"`
			Name string `json:"name"`
		}{id, name})
	}
	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(users)
}

func insertData(db *sql.DB, name string, w http.ResponseWriter) {
	stmt, err := db.Prepare("INSERT INTO users(name) VALUES(?)")
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	defer stmt.Close()
	res, err := stmt.Exec(name)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	id, _ := res.LastInsertId()
	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(map[string]int64{"id": id})
}

func deleteData(db *sql.DB, id int, w http.ResponseWriter) {
	stmt, err := db.Prepare("DELETE FROM users WHERE id=?")
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	defer stmt.Close()
	res, err := stmt.Exec(id)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	affected, _ := res.RowsAffected()
	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(map[string]int64{"deleted": affected})
}
  1. 添加mysql的依赖
bash 复制代码
go get -u github.com/go-sql-driver/mysql
  1. 添加gin的依赖
bash 复制代码
go get -u github.com/gin-gonic/gin
  1. 添加对gorm的依赖
bash 复制代码
go get -u gorm.io/gorm

go.mod文件

Go 复制代码
module go-backend

go 1.24.0

require (
	github.com/go-sql-driver/mysql v1.9.2
	github.com/gorilla/mux v1.8.1
)

require filippo.io/edwards25519 v1.1.0 // indirect

然后启动

Go 复制代码
go run main.go

获取用户数据

http://localhost:8083/users

插入用户数据

http://localhost:8083/users

删除用户数据

http://localhost:8083/users/4

相关推荐
程序猿202315 小时前
索引的使用及设计规则
mysql
·云扬·15 小时前
MySQL Join关联查询:从算法原理到实战优化
数据库·mysql·算法
赴前尘16 小时前
golang获取一个系统中没有被占用的端口
开发语言·后端·golang
田超凡16 小时前
深入理解MySQL_5 BufferPool缓冲池
mysql·java-ee
sandyznb16 小时前
go面试汇总
开发语言·面试·golang
ZePingPingZe18 小时前
MySQL-InnoDB锁与事务
数据库·mysql
h79971019 小时前
高效统计mysql数据踩坑笔记
数据库·mysql
猿小喵19 小时前
TDSQL-MySQL相对MySQL5.7版本主从复制性能优化
数据库·mysql·性能优化
韩立学长19 小时前
【开题答辩实录分享】以《学生心理预防监控信息系统的设计与实现开题报告》为例进行选题答辩实录分享
mysql·php
姓蔡小朋友19 小时前
MySQL读写锁(元数据锁、意向锁、行锁、间隙锁、临键锁)
数据库·mysql