在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操作。
需要注意的是,在实际应用中需要进行必要的参数验证和错误处理,以保证系统的稳定性和安全性。