项目介绍
成为一名全栈工程师是许多程序员都巴望完成的愿望。但是这并不是一件简单的工作:它需求各种技能和知识,以及继续学习和实践的态度。
我最近做了一个项目叫做《go-vue-react》,这是一个前后端别离的Web应用程序。在这个项目中,我运用了三种不同的技能栈:Go言语、Vue 3 和React 18。其间后端是运用的Go言语,数据库选用的是Mysql。前端做了两套,分别运用了Vue 3 和 React 18 技能栈, 咱们根据自己的需求,自行挑选学习其间的一个或者多个项目。下面是我的经历分享:
go-vue-react项目
全栈启蒙版本分支:分支go-vue-react-base
my github 主页:github.com/github-kiko
前言
本文将介绍怎么运用Go言语和MySQL数据库完成最根底的CRUD操作。假如你是一个零根底的学习者,那么这篇文章必定会对你有所协助。在开端之前,请确保你现已装置了Go和MySQL。
go环境装备
首先,让咱们写一个Go版的Hello, World程序来确认咱们的Go环境是否正确装备:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
这个程序打印出了“Hello, World!”。假如你现已成功地编译并运行了这个程序,那么你能够进入下一步了。
MySQL的下载装置
接下来咱们需求下载装置MySQL数据库。请遵从官方文档进行装置指导:dev.mysql.com/doc/mysql-i…。
装置完成后,你需求发动MySQL服务。在Windows环境下,你能够在指令行中输入以下指令:
net start mysql
数据库可视化工具 Navicat
Navicat是一款功能强壮的数据库办理工具,支撑多种数据库类型,如MySQL、PostgreSQL、Oracle等。它提供了一个直观的用户界面,能够协助用户轻松地办理和操作各种数据库。
总的来说,Navicat是一个非常强壮的工具,能够大大提高数据库办理和操作的功率和便利性。无论您是一名数据库办理员还是开发人员,都值得一试。
在做项目的时候,咱们需求在Navicat创立一个名为crud-list的数据库,账号为root,暗码为12345678,端口为3306。
衔接MySQL数据库
在Go中衔接MySQL数据库需求运用第三方库。咱们挑选运用"gorm.io/driver/mysql"
库。通过以下指令来装置该库:
go get -u github.com/gorm.io/driver/mysql
装置完成后,咱们能够运用以下代码来衔接MySQL数据库:
// 衔接数据库
dsn := "root:12345678@tcp(127.0.0.1:3306)/crud-list?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
//处理表名复数问题
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
})
fmt.Println("db:",db)
fmt.Println("err:",err)
代码中的root
和12345678
分别是你的MySQL用户名和暗码,crud-list
是你要衔接的数据库称号。假如衔接成功,程序将输出db
。
衔接池
// GORM 运用database/sql保护衔接池
sqlDB, err := db.DB()
// SetMaxIdleConns 设置空闲衔接池中衔接的最大数量
sqlDB.SetMaxIdleConns(10)
// SetMaxOpenConns 设置打开数据库衔接的最大数量。
sqlDB.SetMaxOpenConns(100)
// SetConnMaxLifetime 设置了衔接可复用的最大时间。
sqlDB.SetConnMaxLifetime(10 * 1000) //10秒钟
结构体和主动搬迁
// 结构体 数据库大写,json小写
type List struct {
gorm.Model //处理主键缺失
ID uint8 `json:"id"`
Name string `json:"name"`
Age uint8 `json:"age"`
School string `json:"school"`
Phone string `json:"phone"`
Address string `json:"address"`
}
//主动搬迁
db.AutoMigrate(&List{})
// 接口
r:=gin.Default()
// 端口
PORT:="3000"
r.Run(":"+PORT)
结构体数据库是大写,回来给前端的json是小写, gorm.model是处理主键缺失问题,不然数据库不满足标准,没有ID和创立更新时间等。主动搬迁会主动创立表字段,便利省事。
完成CRUD操作
刺进数据
// 添加:
r.POST("/list/add",func(c*gin.Context){
var data List
err :=c.ShouldBindJSON(&data)
if err != nil {
c.JSON(200,gin.H{
"msg":"添加失利",
"data":gin.H{},
"code":400,
})
}else{
// 操作数据库
db.Create(&data)
c.JSON(200,gin.H{
"msg":"添加成功",
"data":gin.H{},
"code":200,
})
}
})
删去数据
// 删去
r.DELETE("/list/delete/:id",func(c*gin.Context){
var data []List
// 接收前端传过来的ID
id :=c.Param("id")
// 判别ID是否存在
db.Where("id =?",id).Find(&data)
// ID存在则进行删去、不存在则进行报错
if len(data)==0{
c.JSON(200,gin.H{
"msg":"id没有找到,删去失利",
"code":400,
})
}else{
// 操作数据库
db.Where("id=?",id).Delete(&data)
c.JSON(200,gin.H{
"msg":"删去成功",
"code":200,
})
}
})
更新数据
// 修正
r.PUT("/list/update/:id",func(c*gin.Context){
var data List
// 接收前端传过来的ID
id :=c.Param("id")
// 判别ID是否存在
db.Select("id").Where("id =?",id).Find(&data)
// ID存在则进行修正、不存在则进行报错
if data.ID==0{
c.JSON(200,gin.H{
"msg":"id没有找到,修正失利",
"code":400,
})
}else{
err :=c.ShouldBindJSON(&data)
if err !=nil{
c.JSON(200,gin.H{
"msg":"修正失利",
"code":400,
})
}else{
// 操作数据库
db.Where("id=?",id).Updates(&data)
c.JSON(200,gin.H{
"msg":"修正成功",
"code":200,
})
}
}
})
查询数据
// 查询
r.GET("/list/query",func(c*gin.Context){
// 获取途径参数
var dataList []List
//获取分页参数
pageSize, _ := strconv.Atoi(c.Query("pageSize"))
page, _ := strconv.Atoi(c.Query("page"))
// 计算偏移量和限制数量,支撑更灵活的分页参数设置
offset := (page - 1) * pageSize
limit := pageSize
// 回来一个总数
var total int64
name := c.Query("name")
fmt.Printf("查询条件:%s\n", name)
fmt.Printf("offset: %d\n", offset)
fmt.Printf("limit: %d\n", limit)
db.Model(&List{}).Where("name LIKE ?", fmt.Sprintf("%%%s%%", name)).Count(&total)
// 条件查询并进行分页
db.Where("name LIKE ?", fmt.Sprintf("%%%s%%", name)).Offset(offset).Limit(limit).Find(&dataList)
//判别是否查询到数据
if len(dataList)==0{
c.JSON(200,gin.H{
"msg":"没有查询到数据",
"code":200,
"data":gin.H{},
})
}else{
c.JSON(200,gin.H{
"msg":"查询成功",
"code":200,
"data":dataList,
"total":total,
})
}
})
总结
- 主键缺失问题:数据库都是逻辑删去,并不会真实的删去数据,会有ID,创立时间、更新数据,删去时间等,这叫做主键,没有这些是不符合标准的。能够在结构体中添加gorm.Model 处理
- 表名复数问题:在创立表的时候,数据库的表会带s,但实际咱们创立的数据库表是不带s的,能够通过gorm的装备处理
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
-
数据库操作时首字母大写,而回来给前端的json是小写,所以必须在结构体中界说为首字母大写,假如你在结构体中不指定json为小写,因为数据库是大写,那么回来给前端的数据也会是大写,所以需求在结构体中指定json为小写。
-
需求进技能交流群的,请加我微信:
fangdongdong_25,备注:go-vue-react