项目介绍

成为一名全栈工程师是许多程序员都巴望完成的愿望。但是这并不是一件简单的工作:它需求各种技能和知识,以及继续学习和实践的态度。

我最近做了一个项目叫做《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)

代码中的root12345678分别是你的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,
			})
		}
	})

总结

  1. 主键缺失问题:数据库都是逻辑删去,并不会真实的删去数据,会有ID,创立时间、更新数据,删去时间等,这叫做主键,没有这些是不符合标准的。能够在结构体中添加gorm.Model 处理
  2. 表名复数问题:在创立表的时候,数据库的表会带s,但实际咱们创立的数据库表是不带s的,能够通过gorm的装备处理
NamingStrategy: schema.NamingStrategy{
		SingularTable: true,
		},
  1. 数据库操作时首字母大写,而回来给前端的json是小写,所以必须在结构体中界说为首字母大写,假如你在结构体中不指定json为小写,因为数据库是大写,那么回来给前端的数据也会是大写,所以需求在结构体中指定json为小写。

  2. 需求进技能交流群的,请加我微信:fangdongdong_25,备注:go-vue-react

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。