当前位置: 首页 > ds >正文

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

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

create table users
(id   int auto_incrementprimary key,name varchar(255) null
);

查询所有用户信息:

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 intvar name stringerr := 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})
}

根据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})
}

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

package mainimport ("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 intvar name stringerr := 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的依赖

go get -u github.com/go-sql-driver/mysql

2. 添加gin的依赖

go get -u github.com/gin-gonic/gin

3. 添加对gorm的依赖

go get -u gorm.io/gorm

go.mod文件

module go-backendgo 1.24.0require (github.com/go-sql-driver/mysql v1.9.2github.com/gorilla/mux v1.8.1
)require filippo.io/edwards25519 v1.1.0 // indirect

然后启动

go run main.go

获取用户数据

http://localhost:8083/users

插入用户数据

 http://localhost:8083/users

删除用户数据 

http://localhost:8083/users/4

http://www.xdnf.cn/news/4936.html

相关文章:

  • JS 问号(?)运算符避免中间报错
  • VNC windows连接ubuntu桌面
  • 涨薪技术|0到1学会性能测试第52课-Tomcat调优技术
  • 从回调到 Promise:异步编程进化史
  • 数据库(MySQL)基础
  • 【Python】Python项目中的依赖与配置:requirements.txt、setup.py、pyproject.toml 详解
  • git cola如何选择指定的多个commit同时合并到另外一个分支上
  • vscode与keil的乱码不兼容问题
  • 3.2.3 掌握RDD转换算子 - 3. 扁平映射算子 - flatMap()
  • matlab稳定求解高精度二维对流扩散方程
  • ​​​​​​​MySQL数据库故障排查指南
  • springboot+vue实现在线网盘(云盘)系统
  • Open CASCADE学习|Geom2d_Curve类
  • c语言if else语句格式(非常详细)
  • 管道符_+xargs拓展参数传递操作,以及find指令
  • 真相与幻象的博弈:AI“幻觉”的生成密码与治理革命
  • 稀疏数组在组合优化中的典型应用场景
  • 数据透视表控件DHTMLX Pivot v2.1发布,新增HTML 模板、增强样式等多个功能
  • 快速上手知识图谱开源库AmpliGraph教程指南(二)
  • 深入探索 JavaScript 中的模块对象
  • 算法中的数学:约数
  • 【嵌入式开发-xxxxx】
  • 基于51单片机的步进电机控制系统—正/反转、加/减速
  • HarmonyOS-hdc远程网络方式连接设备
  • PVP鼠标推荐(deepseek)
  • leetcode 242. Valid Anagram
  • 技术视界 | 青龙机器人训练地形详解(三):复杂地形精讲之台阶
  • cpp自学 day24(STL初步认识)
  • 73页最佳实践PPT《DeepSeek自学手册-从理论模型训练到实践模型应用》
  • 自研MCU芯片闪存驱动的实现:OpenOCD详细过程记录与操作指南