Gin 原生数据库CURD 的代码示范

141 min read

在Gin中,原生数据库CRUD示例如下:

// 引入数据库驱动
import (
	"database/sql"
	"fmt"
	"log"
	"net/http"
	"strconv"
	"strings"

	"github.com/gin-gonic/gin"
	_ "github.com/go-sql-driver/mysql"
)

// 数据库配置
const (
	userName = "root"
	password = "123456"
	ip       = "127.0.0.1"
	port     = "3306"
	dbName   = "test"
)

// 创建一个全局变量DB对象
var db *sql.DB

// 初始化DB连接并返回DB对象
func initDB() {
	var err error
	connectStr := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8", userName, password, ip, port, dbName)
	db, err = sql.Open("mysql", connectStr)
	if err != nil {
		log.Fatal("数据库连接失败: ", err)
		return
	}
	// 设置连接池默认最大连接数和最大空闲数
	db.SetMaxOpenConns(100)
	db.SetMaxIdleConns(10)
}

// 定义Article数据结构体
type Article struct {
	Id    int    `json:"id"`
	Title string `json:"title"`
	Body  string `json:"body"`
}

// 新建文章
func CreateArticle(c *gin.Context) {
	title := c.PostForm("title")
	body := c.PostForm("body")
	if title == "" || body == "" {
		c.JSON(http.StatusBadRequest, gin.H{"error": "参数为空"})
		return
	}
	_, err := db.Exec("insert into article(title,body) values(?,?)", title, body)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "新增文章失败"})
		return
	}
	c.JSON(http.StatusOK, gin.H{"msg": "新增文章成功"})
}

// 查询文章列表
func GetArticleList(c *gin.Context) {
	rows, err := db.Query("select id,title,body from article")
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "获取文章列表失败"})
		return
	}
	defer rows.Close()
	var articles []Article
	for rows.Next() {
		var article Article
		rows.Scan(&article.Id, &article.Title, &article.Body)
		articles = append(articles, article)
	}
	c.JSON(http.StatusOK, gin.H{"data": articles})
}

// 查询单篇文章
func GetArticleById(c *gin.Context) {
	id, _ := strconv.Atoi(c.Param("id"))
	var article Article
	err := db.QueryRow("select id,title,body from article where id=?", id).Scan(&article.Id, &article.Title, &article.Body)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "文章不存在"})
		return
	}
	c.JSON(http.StatusOK, gin.H{"data": article})
}

// 更新文章
func UpdateArticle(c *gin.Context) {
	id, _ := strconv.Atoi(c.Param("id"))
	title := c.PostForm("title")
	body := c.PostForm("body")
	if title == "" || body == "" {
		c.JSON(http.StatusBadRequest, gin.H{"error": "参数为空"})
		return
	}
	result, err := db.Exec("update article set title=?,body=? where id=?", title, body, id)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "更新文章失败"})
		return
	}
	rowsAffected, _ := result.RowsAffected()
	if rowsAffected == 0 {
		c.JSON(http.StatusBadRequest, gin.H{"error": "文章不存在"})
		return
	}
	c.JSON(http.StatusOK, gin.H{"msg": "更新文章成功"})
}

// 删除文章
func DeleteArticle(c *gin.Context) {
	id, _ := strconv.Atoi(c.Param("id"))
	result, err := db.Exec("delete from article where id=?", id)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "删除文章失败"})
		return
	}
	rowsAffected, _ := result.RowsAffected()
	if rowsAffected == 0 {
		c.JSON(http.StatusBadRequest, gin.H{"error": "文章不存在"})
		return
	}
	c.JSON(http.StatusOK, gin.H{"msg": "删除文章成功"})
}

func main() {
	// 初始化DB连接
	initDB()

	// 创建Gin实例
	r := gin.Default()

	// 创建文章
	r.POST("/articles", CreateArticle)

	// 获取文章列表
	r.GET("/articles", GetArticleList)

	// 获取单篇文章
	r.GET("/articles/:id", GetArticleById)

	// 更新文章
	r.PUT("/articles/:id", UpdateArticle)

	// 删除文章
	r.DELETE("/articles/:id", DeleteArticle)

	// 启动Gin服务
	log.Fatal(r.Run(":8080"))
}

以上代码中,实现了对Article数据表的CRUD操作,包括创建(Create),查询列表(Get),查询单篇(GetById),更新(Update)和删除(Delete)等功能。

其中,使用了Gin框架的路由和参数绑定功能,能够方便地处理请求,同时通过MySQL的原生API实现了CRUD操作。

需要注意的是,在实际应用中需要进行必要的参数验证和错误处理,以保证系统的稳定性和安全性。