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

相关推荐
Nalu CONG14 分钟前
mysql数据被误删的恢复方案
数据库·mysql
UpYoung!1 小时前
【数据库工具】DBeaver——轻量化多功能数据库连接工具DBeaver Ultimate 24.0.0版详细下载安装指南
数据库·mysql·sqlserver·数据库开发·数据库管理·dbeaver·数据库工具
码界筑梦坊1 小时前
94-基于Python的商品物流数据可视化分析系统
开发语言·python·mysql·信息可视化·数据分析·毕业设计·fastapi
爱莉希雅&&&3 小时前
Ansible+Docker案例(含ansible配置安装docker)
linux·运维·mysql·nginx·docker·容器·ansible
SarL EMEN4 小时前
Linux(CentOS)安装 MySQL
linux·mysql·centos
银河系的一束光4 小时前
net start mysql 服务名无效。 请键入 NET HELPMSG 2185 以获得更多的帮助
数据库·mysql
untE EADO4 小时前
MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案
android·sql·mysql
西北奇妙的八角4 小时前
mysql大表结构变更导致主从延迟问题复盘
mysql
y = xⁿ5 小时前
MySQL学习日记:关于MVCC及一些八股总结
数据库·学习·mysql
BING_Algorithm5 小时前
JDBC核心教程
java·后端·mysql