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.pswp.cn/news/904642.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904642.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904642.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鍵盤彈起導致頁面上移

問題:聊天頁面,如果輸入框設置了adjust-position屬性為true,會導致鍵盤彈起時,整個頁面上移,頂部導航欄也會跟著上移。 我想要的效果:鍵盤彈起時,頁面內容上移,頂部導航欄保持不動 …

機器視覺的手機FPC油墨絲印應用

在現代智能手機制造過程中,精密的組件裝配和質量控制是確保產品性能和用戶體驗的關鍵。其中,柔性印刷電路板(FPC)的油墨絲印工藝尤為關鍵,它不僅影響到電路板的美觀,更直接關系到電路的導電性能和可靠性。而…

ChromeDriverManager的具體用法

ChromeDriverManager 是 webdriver_manager 庫的一部分,它用于自動管理 ChromeDriver 的下載和更新。使用 ChromeDriverManager 可以避免手動下載 ChromeDriver 并匹配系統中安裝的 Chrome 瀏覽器版本。以下是 ChromeDriverManager 的基本用法: 步驟 1…

RPC、gRPC和HTTP的區別

RPC 只是一種屏蔽遠程過程調用的設計,它與HTTP不是對立的,兩者不是一個層面的概念。 RPC底層通信可以使用TCP實現(如Thrift),也可以使用HTTP實現(如gRPC),其本身并無限制。 1. 概念…

安裝Pod網絡插件時pod狀態變為ImagePullBackOff

本文摘自于我的免費專欄《Kubernetes從0到1(持續更新)》請多關注 文章目錄 先看案發現場解決過程如下原因剖析解決方法 先看案發現場 原因是在下載Pod網絡插件的時候pod始終為ImagePullBackOff wget https://raw.githubusercontent.com/coreos/flannel…

藍橋杯第十六屆c組c++題目及個人理解

本篇文章只是部分題目的理解&#xff0c;代碼和思路僅供參考&#xff0c;切勿當成正確答案&#xff0c;歡迎各位小伙伴在評論區與博主交流&#xff01; 題目&#xff1a;2025 題目解析 核心提取 要求的數中至少有1個0、2個2、1個5 代碼展示 #include<iostream> #incl…

使用mermaidchart 顯示graph LR

使用mermaidchart 顯示graph LRMermaid Chart - Create complex, visual diagrams with text. A smarter way of creating diagrams.

基于計算機視覺的試卷答題區表格識別與提取技術

基于計算機視覺的試卷答題區表格識別與提取技術 摘要 本文介紹了一種基于計算機視覺技術的試卷答題區表格識別與提取算法。該算法能夠自動從試卷圖像中定位答題區表格&#xff0c;執行圖像方向矯正&#xff0c;精確識別表格網格線&#xff0c;并提取每個答案單元格。本技術可…

SpringAI實現AI應用-自定義顧問(Advisor)

SpringAI實戰鏈接 1.SpringAl實現AI應用-快速搭建-CSDN博客 2.SpringAI實現AI應用-搭建知識庫-CSDN博客 3.SpringAI實現AI應用-內置顧問-CSDN博客 4.SpringAI實現AI應用-使用redis持久化聊天記憶-CSDN博客 5.SpringAI實現AI應用-自定義顧問&#xff08;Advisor&#xff09…

【HarmonyOS 5】App Linking 應用間跳轉詳解

目錄 什么是 App Linking 使用場景 工作原理 如何開發 1.開通 App Linking 2.確定域名 3.服務端部署 applinking.json 文件 4.AGC綁定域名 5.項目配置 6.組裝聚合鏈接 7.解析聚合鏈接中的參數 其他 如何獲取應用ID 什么是 App Linking App Linking 是一款創建跨…

什么是變量提升?(形象的比喻)

當然&#xff01;可以用幾個生活中的比喻來形象地解釋變量提升&#xff1a; ??1. 書架的占位符?? 想象你有一個書架&#xff0c;但還沒放書。 ? 變量提升&#xff08;var&#xff09;&#xff1a; 你先在書架上貼了一個標簽&#xff08;比如寫“我的書”&#xff09;&…

C++面向對象編程入門:從類與對象說起(一)

C語言是面向過程&#xff0c;關注的是過程&#xff0c;分析出求解問題的步驟&#xff0c;通過函數調用逐步解決問題&#xff0c;而C面向的是對象&#xff0c;關注的是對象&#xff0c;將一件事拆解成多個對象&#xff0c;靠對象之間互交完成。 目錄 類的定義 類的兩種定義 …

uniapp tabBar 中設置“custom“: true 在H5和app中無效解決辦法

uniapp小程序自定義底部tabbar&#xff0c;但是在轉成H5和app時發現"custom": true 無效&#xff0c;原生tabbar會顯示出來 解決辦法如下 在tabbar的list中設置 “visible”:false 代碼如下&#xff1a;"tabBar": {"custom": true,//"cust…

SpringBoot學生操行評分系統源碼設計開發

概述 基于SpringBoot框架開發的學生操行評分系統完整項目&#xff0c;該系統采用主流技術棧開發&#xff0c;包含完善的評分管理功能模塊&#xff0c;是學校管理、教育培訓機構理想的數字化解決方案&#xff0c;非常適合作為設計參考或二次開發基礎項目。 主要內容 5.1 管理…

從代碼學習深度學習 - 單發多框檢測(SSD)PyTorch版

文章目錄 前言工具函數數據處理工具 (`utils_for_data.py`)訓練工具 (`utils_for_train.py`)檢測相關工具 (`utils_for_detection.py`)可視化工具 (`utils_for_huitu.py`)模型類別預測層邊界框預測層連接多尺度預測高和寬減半塊基礎網絡塊完整的模型訓練模型讀取數據集和初始化…

基于STM32的溫濕度光照強度仿真設計(Proteus仿真+程序設計+設計報告+講解視頻)

這里寫目錄標題 **1.****主要功能****2.仿真設計****3.程序設計****4.設計報告****5.下載鏈接** 基于STM32的溫濕度光照強度仿真設計(Proteus仿真程序設計設計報告講解視頻&#xff09; 仿真圖Proteus 8.9 程序編譯器&#xff1a;keil 5 編程語言&#xff1a;C語言 設計編號…

SSH 服務部署指南

本指南涵蓋 OpenSSH 服務端的安裝、配置密碼/公鑰/多因素認證&#xff0c;以及連接測試方法。 適用系統&#xff1a;Ubuntu/Debian、CentOS/RHEL 等主流 Linux 發行版。 1. 安裝 SSH 服務端 Ubuntu/Debian # 更新軟件包索引 sudo apt update# 安裝 OpenSSH 服務端 sudo apt i…

《Python星球日記》 第46天:決策樹與隨機森林

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 專欄:《Python星球日記》,限時特價訂閱中ing 目錄 一、前言二、決策樹算法原理1. 決策樹簡介2. 決策樹的分裂準則(1) 信息熵與信息增益(2) 基尼不純…

Vue2:引入公共JS,通過this調用

tools.js // 圖片加上前綴 baseurl 是請求域名 img 是圖片路徑export function getimgurl(img) {return ${this.$baseurl}${img}}main.js import baseUrl from "/api/baseUrl.js" Vue.prototype.$baseurl baseUrlimport {getimgurl} from /api/tool.js; Vue.protot…

【Hot 100】 146. LRU 緩存

目錄 引言LRU 緩存官方解題LRU實現&#x1f4cc; 實現步驟分解步驟 1&#xff1a;定義雙向鏈表節點步驟 2&#xff1a;創建偽頭尾節點&#xff08;關鍵設計&#xff09;步驟 3&#xff1a;實現鏈表基礎操作操作 1&#xff1a;添加節點到頭部操作 2&#xff1a;移除任意節點 步驟…