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

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

相关文章:

  • SEMI E40-0200 STANDARD FOR PROCESSING MANAGEMENT(加工管理标准)-(二)
  • 快消品行业案例:安达发APS计划排产软件如何实现季节性需求波动应对?
  • 英皇娱乐X乐华娱乐携手造星!“英皇乐华青少年艺人培训班”正式启动!
  • 多智能体学习CAMEL-调用api
  • 《零基础学机器学习》学习大纲
  • 正点原子IMX6U开发板移植Qt时出现乱码
  • 6:点云处理—QT三维窗口显示
  • 机器学习实操 第二部分 神经网路和深度学习 第17章 编码器、生成对抗网络和扩散模型
  • SpringBoot教程(vuepress版)
  • 卷积神经网络基础(八)
  • Spring Boot 中 MongoDB @DBRef注解适用什么场景?
  • 通过混合机器学习和 TOPSIS 实现智能手机身份验证的稳健行为生物识别框架
  • 力扣94. 二叉树的中序遍历
  • CentOS的防火墙工具(firewalld和iptables)的使用
  • npm create vite@latest my-vue-app 解读
  • Ansible 流程控制
  • Linux防火墙
  • 新能源汽车赛道变局:传统车企子品牌私有化背后的战略逻辑
  • QtGUI模块功能详细说明, 字体和文本渲染(四)
  • ESP32 DAC音频应用示例与场景
  • 本周看啥|《歌手》今晚全开麦直播,谁能斩获第一名?
  • 受贿1.29亿余元,黑龙江省原副省长王一新被判无期
  • 昔日千亿房企祥生集团约2.03亿元债权被拍卖,起拍价8000万元
  • 女子七年后才知银行卡被盗刷18万元,警方抓获其前男友
  • 昆明公布3起经济犯罪案例:一人持有820余万假美元被判刑十年
  • 特朗普再提“接管”加沙,要将其变为“自由区”