Go使用Gin寫(xiě)一個(gè)對(duì)MySQL的增刪改查的實(shí)現(xiàn)
首先用SQL創(chuàng)建一個(gè)包含id、name屬性的users表
create table users ( id int auto_increment primary 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 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) }
根據(jù)姓名插入一個(gè)用戶信息
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}) }
根據(jù)id刪除一個(gè)用戶信息
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}) }
三個(gè)方法整合一起放到main.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的依賴
go get -u github.com/go-sql-driver/mysql
2. 添加gin的依賴
go get -u github.com/gin-gonic/gin
3. 添加對(duì)gorm的依賴
go get -u gorm.io/gorm
go.mod文件
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
然后啟動(dòng)
go run main.go
獲取用戶數(shù)據(jù)
http://localhost:8083/users
插入用戶數(shù)據(jù)
http://localhost:8083/users
刪除用戶數(shù)據(jù)
http://localhost:8083/users/4
到此這篇關(guān)于Go使用Gin寫(xiě)一個(gè)對(duì)MySQL的增刪改查的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Gin MySQL增刪改查內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go Gin框架中的binding驗(yàn)證器使用小結(jié)
Gin框架中的binding驗(yàn)證器為我們提供了簡(jiǎn)便的數(shù)據(jù)綁定和驗(yàn)證功能,通過(guò)合理使用binding和validate標(biāo)簽,我們可以確保API接口的數(shù)據(jù)合法性和完整性,這篇文章主要介紹了Go Gin框架中的binding驗(yàn)證器使用指南,需要的朋友可以參考下2024-07-07GOPROXY:解決go get golang.org/x包失敗問(wèn)題
這篇文章主要介紹了GOPROXY:解決go get golang.org/x包失敗問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01golang 的string與[]byte轉(zhuǎn)換方式
這篇文章主要介紹了golang 的string與[]byte轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04一文帶你了解Go語(yǔ)言fmt標(biāo)準(zhǔn)庫(kù)輸出函數(shù)的使用
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中 fmt 標(biāo)準(zhǔn)庫(kù)輸出函數(shù)的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12Windows10系統(tǒng)下安裝Go環(huán)境詳細(xì)步驟
Go語(yǔ)言是谷歌推出的一款全新的編程語(yǔ)言,可以在不損失應(yīng)用程序性能的情況下極大的降低代碼的復(fù)雜性,這篇文章主要給大家介紹了關(guān)于Windows10系統(tǒng)下安裝Go環(huán)境的詳細(xì)步驟,需要的朋友可以參考下2023-11-11詳解如何在Golang中監(jiān)聽(tīng)多個(gè)channel
這篇文章主要為大家詳細(xì)介紹了如何在Golang中實(shí)現(xiàn)監(jiān)聽(tīng)多個(gè)channel,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03