Go使用Gin+mysql实现增删改查的详细实例
作者:Harris-H 发布时间:2024-01-20 20:38:43
标签:gin,mysql,增删改查
0.前置知识
Go中的struct。
mysql、Gin框架。
Web基础。
1.架构
使用mysql作为数据库,Gin作为Web框架。
2.功能模块
1.自定义Person结构体
2.实现对Person的增删改查。
根据id查询或查询所有
插入
修改
删除
3.实现流程
1.建立数据库连接池db,然后连接指定的数据库。
2.编写Web接口(增删改查)
3.通过postman测试或者直接网页请求测试。
4.代码
package main
// 导入模块
import (
"bytes"
"database/sql"
"fmt"
"github.com/gin-gonic/gin"
_ "github.com/go-sql-driver/mysql"
"log"
"net/http"
"strconv"
)
var db *sql.DB
// Person 自定义Person类
type Person struct {
Id int `json:"id"`
FirstName string `json:"first_name" form:"first_name"`
LastName string `json:"last_name" form:"last_name"`
}
func (p *Person) get(db *sql.DB) (person Person, err error) {
row := db.QueryRow("SELECT id,first_name,last_name from person where id=?", p.Id)
err = row.Scan(&person.Id, &person.FirstName, &person.LastName)
if err != nil {
return
}
return
}
func (p *Person) getAll(db *sql.DB) (persons []Person, err error) {
rows, err := db.Query("select id,first_name,last_name from person")
fmt.Println(rows)
if err != nil {
return
}
for rows.Next() {
var person Person
rows.Scan(&person.Id, &person.FirstName, &person.LastName)
persons = append(persons, person)
}
defer rows.Close()
return
}
func (p *Person) add(db *sql.DB) (Id int, err error) {
stmt, err := db.Prepare("INSERT into person(first_name,last_name) values (?,?)")
if err != nil {
return
}
rs, err := stmt.Exec(p.FirstName, p.LastName)
if err != nil {
return
}
id, err := rs.LastInsertId()
if err != nil {
log.Fatalln(err)
}
Id = int(id)
defer stmt.Close()
return
}
func (p *Person) update(db *sql.DB) (rows int, err error) {
stmt, err := db.Prepare("update person set first_name=?,last_name=? where id=?")
if err != nil {
log.Fatalln(err)
}
rs, err := stmt.Exec(p.FirstName, p.LastName, p.Id)
if err != nil {
log.Fatalln(err)
}
row, err := rs.RowsAffected()
if err != nil {
log.Fatalln(err)
}
rows = int(row)
defer stmt.Close()
return
}
func (p *Person) del(db *sql.DB) (rows int, err error) {
stmt, err := db.Prepare("delete from person where id=?")
if err != nil {
log.Fatalln(err)
}
rs, err := stmt.Exec(p.Id)
if err != nil {
log.Fatalln(err)
}
row, err := rs.RowsAffected()
if err != nil {
log.Fatalln(err)
}
rows = int(row)
defer stmt.Close()
return
}
func test(db *sql.DB) {
rows, err := db.Query("select * from person")
if err != nil {
return
}
defer rows.Close()
var persons []Person
for rows.Next() {
var person Person
rows.Scan(&person.Id, &person.FirstName, &person.LastName)
persons = append(persons, person)
}
fmt.Println(persons)
}
func main() {
var err error
db, err := sql.Open("mysql", "root:xxxxx@tcp(127.0.0.1:3306)/go_project01?parseTime=true")
if err != nil {
log.Fatal(err.Error())
}
//defer db.Close()
err = db.Ping()
if err != nil {
log.Fatal(err.Error())
}
//test(db)
//创建路由引擎
router := gin.Default()
//查询,返回所有对象和对象个数
router.GET("/persons", func(context *gin.Context) {
p := Person{}
persons, err := p.getAll(db)
if err != nil {
log.Fatalln(err)
}
context.JSON(http.StatusOK, gin.H{
"result": persons,
"count": len(persons),
})
})
//根据id查询
router.GET("/person/:id", func(context *gin.Context) {
var result gin.H
id := context.Param("id")
Id, err := strconv.Atoi(id)
if err != nil {
log.Fatalln(err)
}
p := Person{
Id: Id,
}
person, err := p.get(db)
if err != nil {
result = gin.H{
"result": nil,
"count": 0,
}
} else {
result = gin.H{
"result": person,
"count": 1,
}
}
context.JSON(http.StatusOK, result)
})
//创建person
router.POST("/person", func(context *gin.Context) {
var p Person
err := context.Bind(&p)
if err != nil {
log.Fatalln(err)
}
Id, err := p.add(db)
if err != nil {
log.Fatalln(err)
}
fmt.Println(Id)
name := p.FirstName + " " + p.LastName
context.JSON(http.StatusOK, gin.H{
"message": fmt.Sprintf(" %s 成功创建", name),
})
})
//更新update
router.PUT("/person/:id", func(context *gin.Context) {
var (
p Person
buffer bytes.Buffer
)
id := context.Param("id")
Id, err := strconv.Atoi(id)
if err != nil {
log.Fatalln(err)
}
err = context.Bind(&p)
if err != nil {
log.Fatalln(err)
}
p.Id = Id
rows, err := p.update(db)
if err != nil {
log.Fatalln(err)
}
fmt.Println(rows)
buffer.WriteString(p.FirstName)
buffer.WriteString(" ")
buffer.WriteString(p.LastName)
name := buffer.String()
context.JSON(http.StatusOK, gin.H{
"message": fmt.Sprintf("成功更新到%s", name),
})
})
//删除person
router.DELETE("/person/:id", func(context *gin.Context) {
id := context.Param("id")
Id, err := strconv.ParseInt(id, 10, 10)
if err != nil {
log.Fatalln(err)
}
p := Person{Id: int(Id)}
rows, err := p.del(db)
if err != nil {
log.Fatalln(err)
}
fmt.Println("delete rows: ", rows)
context.JSON(http.StatusOK, gin.H{
"message": fmt.Sprintf("成功删除用户:%s", id),
})
})
router.Run(":8080")
}
5.结果
总结
来源:https://blog.csdn.net/weixin_45750972/article/details/127112887
0
投稿
猜你喜欢
- 本文实例为大家分享了Vue实现通知或详情类弹窗的具体代码,供大家参考,具体内容如下效果如图所示:(整体样式模仿ant-design-vue
- ASP+Access数据库的18条安全法则:1.首先,我们需要过滤所有客户端提交的内容,其中包括?id=N一类,另外还有提交的html代码中
- Golang连接Redis数据库golang连接数据库,这里博主推荐使用go-redis这个库,理由很简单(连接数据库的操作类似在数据库里面
- 内容摘要:当讨论Request对象内容时,要研究的集合之一就是ServerVariables集合。这个集合包含了两种值的结合体,一种是随同页
- 1. 箭头函数的使用ES6 中新增了使用箭头=>来定义函数表达式的方法。很多情况下,箭头函数和函数表达式创建的函数并无区别,只有写法上
- 在C++11和C#中都有匿名函数的存在。下面看看在python中匿名函数的使用。1.lambda只是一个表达式,函数体比def简单很多。2.
- 业务需求:需要测试手机滑动解锁失败时事件的次数及等待的时间,本来想利用Python+Appium实现,但是Appium运行时自动给我解锁了.
- if exists(select * from tempdb..sysobjects where id=object_id('tem
- 前言:字体反爬是什么个意思?就是网站把自己的重要数据不直接的在源代码中呈现出来,而是通过相应字体的编码,与一个字体文件(一般后缀为ttf或w
- Python 通过pip安装Django详细介绍经过前面的 Python 包管理工具的学习,接下来我们就要基于前面的知识,来配置 Djang
- 一、使用+号添加列表元素一般情况下两个列表合并起来也是一种添加元素的方法,只要使用+号直接进行运算就可以了,下面是演示代码。name1 =
- 拼接字符串使用“+”运算符可完成对多个字符串的拼接,“+”运算符可以连接多个字符串并产生一个字符串对象。字符串不允许直接与其他类型数据拼接。
- django执行sql语句后得到的返回结果是一个结果集,直接把结果转json返回给前端会报错,需要先遍历转字典在转json,特别注意mode
- 本文实例讲述了vue多次循环操作。分享给大家供大家参考,具体如下:需求:有以下一个数组,想将其对象里的信息展示出来,而且还要把对象下面的数组
- 方法说明: 同步版的fs.writeFile() 。语法:fs.writeFileSync(filename, data, [o
- 一、简介py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具,这样,你就可以不用装pyth
- 先给大家展示实现后效果:为直观期间,先贴出来我做的效果列表展示和地图展示以及联动显示信息实现思路:1、列表与地图的互动鼠标经过列表时,修改列
- 环境:xadmin-for-python3 python3.5.2 django1.9.12问题描述:Product ProductSku两
- 本文实例为大家分享了python3使用matplotlib绘制条形图的具体代码,供大家参考,具体内容如下绘制竖状条形图代码from matp
- python,pycharm的环境变量设置官网下载安装python解释器时,如果忘记勾选添加到环境变量[add to path],可进行如下