Go语言加Vue3零基础入门全栈班11 Go语言+gorm用户管理系统实战 2024年08月03日 课程笔记

news2025/1/21 22:01:46

概述

如果您没有Golang的基础,应该学习如下前置课程。

  • Golang零基础入门
  • Golang面向对象编程
  • Go Web 基础
  • Go语言开发REST API接口_20240728
  • Go语言操作MySQL开发用户管理系统API教程_20240729
  • Redis零基础快速入门_20231227
  • Go+Redis开发用户管理系统API实战_20240730
  • MongoDB快速入门_20240411
  • Go语言+MongoDB用户管理系统实战_20240730
  • Go语言+gRPC用户微服务项目实战_20240730

基础不好的同学每节课的代码最好配合视频进行阅读和学习,如果基础比较扎实,则阅读本教程巩固一下相关知识点即可,遇到不会的知识点再看视频。

课程特色

本教程录制于2024年8月3日,使用Go1.22版本,基于Goland2024进行开发,采用的技术栈比较新。

每节课控制在十分钟以内,课时精简,每节课都是一个独立的知识点,如果有遗忘,完全可以当做字典来查询,绝不浪费大家的时间。

整个课程从如何连接MySQL讲起,讲解gorm的增删改查常见操作,然后结合REST API接口开发的知识,开发一个用户管理系统的后端API服务,层层递进,学习路径平缓。

Golang是当前国内越来越多的企业正在全面转的一门系统级别的高性能的编程语言,比C语言写法更加的简单,比Python性能更加的好,是新时代的C语言,建议每个程序员都掌握!

视频课程

最近发现越来越多的公司在用Golang了,所以精心整理了一套视频教程给大家,这个是其中的第11部,后续还会有很多。

视频已经录制完成,完整目录截图如下:
在这里插入图片描述

本套课程的特色是每节课都是一个核心知识点,每个视频控制在十分钟左右,精简不废话,拒绝浪费大家的时间。

课程目录

  • 01 概述
  • 02 连接MySQL数据库
  • 03 创建表
  • 04 新增数据
  • 05 查询数据
  • 06 修改数据
  • 07 删除数据
  • 08 zdpgo_gorm的介绍和使用
  • 09 事务的使用
  • 10 搭建项目的基本结构
  • 11 封装和使用初始化和关闭MySQL的方法
  • 12 创建和启动服务
  • 13 实现新增用户的接口并进行测试
  • 14 实现查询所有用户的接口并进行测试
  • 15 实现根据ID查询用户的接口并进行测试
  • 16 实现根据ID修改用户的接口并进行测试
  • 17 实现根据ID删除用户的接口并进行测试
  • 18 总结

完整代码

02 连接MySQL数据库

package main

import (
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

func main() {
	db, err := gorm.Open(
		"mysql",
		"root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",
	)
	if err != nil {
		panic(err)
	}
	defer db.Close()

	db.DB().SetMaxIdleConns(10)
	db.DB().SetMaxOpenConns(100)
}

03 创建表

package main

import (
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

type User struct {
	Id   int    `json:"id"`
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	db, err := gorm.Open(
		"mysql",
		"root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",
	)
	if err != nil {
		panic(err)
	}
	defer db.Close()

	db.DB().SetMaxIdleConns(10)
	db.DB().SetMaxOpenConns(100)

	db.AutoMigrate(&User{})
}

04 新增数据

package main

import (
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

type User struct {
	Id   int    `json:"id"`
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	db, err := gorm.Open(
		"mysql",
		"root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",
	)
	if err != nil {
		panic(err)
	}
	defer db.Close()

	db.DB().SetMaxIdleConns(10)
	db.DB().SetMaxOpenConns(100)

	db.AutoMigrate(&User{})

	user := User{11, "张三", 33}
	db.Create(&user)
}

05 查询数据

package main

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

type User struct {
	Id   int    `json:"id"`
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	db, err := gorm.Open(
		"mysql",
		"root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",
	)
	if err != nil {
		panic(err)
	}
	defer db.Close()

	db.DB().SetMaxIdleConns(10)
	db.DB().SetMaxOpenConns(100)

	db.AutoMigrate(&User{})

	var users []User
	db.Find(&users)
	fmt.Println(users)
}

06 修改数据

package main

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

type User struct {
	Id   int    `json:"id"`
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	db, err := gorm.Open(
		"mysql",
		"root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",
	)
	if err != nil {
		panic(err)
	}
	defer db.Close()

	db.DB().SetMaxIdleConns(10)
	db.DB().SetMaxOpenConns(100)

	db.AutoMigrate(&User{})

	db.Model(&User{Id: 11}).Update("name", "李四333")

	var users []User
	db.Find(&users)
	fmt.Println(users)
}

07 删除数据

package main

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

type User struct {
	Id   int    `json:"id"`
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	db, err := gorm.Open(
		"mysql",
		"root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",
	)
	if err != nil {
		panic(err)
	}
	defer db.Close()

	db.DB().SetMaxIdleConns(10)
	db.DB().SetMaxOpenConns(100)

	db.AutoMigrate(&User{})

	db.Delete(&User{Id: 11})

	var users []User
	db.Find(&users)
	fmt.Println(users)
}

08 zdpgo_gorm的介绍和使用

package main

import (
	"fmt"
	"github.com/zhangdapeng520/zdpgo_gorm"
	_ "github.com/zhangdapeng520/zdpgo_mysql"
)

type User struct {
	Id   int    `json:"id"`
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	db, err := zdpgo_gorm.Open(
		"mysql",
		"root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",
	)
	if err != nil {
		panic(err)
	}
	defer db.Close()

	db.DB().SetMaxIdleConns(10)
	db.DB().SetMaxOpenConns(100)

	db.AutoMigrate(&User{})

	var users []User
	db.Find(&users)
	fmt.Println(users)
}

09 事务的使用

package main

import (
	"fmt"
	"github.com/zhangdapeng520/zdpgo_gorm"
	_ "github.com/zhangdapeng520/zdpgo_mysql"
)

type User struct {
	Id   int    `json:"id"`
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	db, err := zdpgo_gorm.Open(
		"mysql",
		"root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",
	)
	if err != nil {
		panic(err)
	}
	defer db.Close()

	db.DB().SetMaxIdleConns(10)
	db.DB().SetMaxOpenConns(100)

	db.AutoMigrate(&User{})

	tx := db.Begin()

	u := User{Name: "赵六", Age: 18}
	err = tx.Create(&u).Error
	if err != nil {
		tx.Rollback()
		panic(err)
	}

	tx.Commit()

	var users []User
	db.Find(&users)
	fmt.Println(users)
}

11 封装和使用初始化和关闭MySQL的方法

package g

import (
	"github.com/zhangdapeng520/zdpgo_gorm"
	_ "github.com/zhangdapeng520/zdpgo_mysql"
	"gorm_api_user2/model"
)

var GDB *zdpgo_gorm.DB

func initMySQL() {
	var err error
	GDB, err = zdpgo_gorm.Open(
		"mysql",
		"root:root@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local",
	)
	if err != nil {
		panic(err)
	}

	GDB.DB().SetMaxIdleConns(10)
	GDB.DB().SetMaxOpenConns(100)

	GDB.AutoMigrate(&model.User{})
}

func closeMySQL() {
	GDB.Close()
}

12 创建和启动服务

package router

import "github.com/zhangdapeng520/zdpgo_httprouter"

func InitRouter() *zdpgo_httprouter.Router {
	router := zdpgo_httprouter.New()

	router.POST("/user", userAdd)
	router.GET("/user", userGetAll)
	router.GET("/user/:id", userGet)
	router.PUT("/user/:id", userUpdate)
	router.DELETE("/user/:id", userDelete)

	return router
}

package main

import (
	"gorm_api_user2/g"
	"gorm_api_user2/router"
	"net/http"
	"time"
)

func main() {
	g.InitGlobal()
	defer g.CloseGlobal()

	server := &http.Server{
		Addr:         ":8888",
		Handler:      router.InitRouter(),
		ReadTimeout:  5 * time.Second,
		WriteTimeout: 5 * time.Second,
	}
	server.ListenAndServe()
}

13 实现新增用户的接口并进行测试

package router

import (
	"github.com/zhangdapeng520/zdpgo_httprouter"
	"gorm_api_user2/g"
	"gorm_api_user2/model"
	"net/http"
)

func userAdd(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {
	var user model.User
	zdpgo_httprouter.GetJson(r, &user)

	g.GDB.Create(&user)

	zdpgo_httprouter.ResponseSuccess(w, user)
}

package router

import (
	"github.com/zhangdapeng520/zdpgo_httprouter"
	"io"
	"os"
	"testing"
)

func TestUserAdd(t *testing.T) {
	targetUrl := "http://127.0.0.1:8888/user"
	data := map[string]interface{}{
		"name": "王五",
		"age":  30,
	}
	resp, err := zdpgo_httprouter.SendJson("POST", targetUrl, data)
	if err != nil {
		t.Error(err)
	}
	io.Copy(os.Stdout, resp.Body)
}

14 实现查询所有用户的接口并进行测试

package router

import (
	"github.com/zhangdapeng520/zdpgo_httprouter"
	"gorm_api_user2/g"
	"gorm_api_user2/model"
	"net/http"
	"strconv"
)

func userGetAll(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {
	var users []model.User
	g.GDB.Find(&users)
	zdpgo_httprouter.ResponseSuccess(w, users)
}

func userGet(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {
	idStr := ps.ByName("id")
	id, _ := strconv.Atoi(idStr)

	var user model.User
	g.GDB.Find(&user, "id=?", id)

	zdpgo_httprouter.ResponseSuccess(w, user)
}

package router

import (
	"io"
	"net/http"
	"os"
	"testing"
)

func TestUserGetAll(t *testing.T) {
	targetUrl := "http://127.0.0.1:8888/user"
	resp, err := http.Get(targetUrl)
	if err != nil {
		t.Error(err)
	}
	io.Copy(os.Stdout, resp.Body)
}

func TestUserGet(t *testing.T) {
	targetUrl := "http://127.0.0.1:8888/user/4"
	resp, err := http.Get(targetUrl)
	if err != nil {
		t.Error(err)
	}
	io.Copy(os.Stdout, resp.Body)
}

16 实现根据ID修改用户的接口并进行测试

package router

import (
	"github.com/zhangdapeng520/zdpgo_httprouter"
	"gorm_api_user2/g"
	"gorm_api_user2/model"
	"net/http"
	"strconv"
)

func userUpdate(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {
	idStr := ps.ByName("id")
	id, _ := strconv.Atoi(idStr)

	var user model.User
	zdpgo_httprouter.GetJson(r, &user)

	g.GDB.Model(model.User{Id: id}).Update("name", user.Name, "age", user.Age)

	zdpgo_httprouter.ResponseSuccess(w, nil)
}

package router

import (
	"github.com/zhangdapeng520/zdpgo_httprouter"
	"io"
	"os"
	"testing"
)

func TestUserUpdate(t *testing.T) {
	targetUrl := "http://127.0.0.1:8888/user/4"
	data := map[string]interface{}{
		"name": "李四333",
		"age":  30,
	}
	resp, err := zdpgo_httprouter.SendJson("PUT", targetUrl, data)
	if err != nil {
		t.Error(err)
	}
	io.Copy(os.Stdout, resp.Body)
}

17 实现根据ID删除用户的接口并进行测试

package router

import (
	"github.com/zhangdapeng520/zdpgo_httprouter"
	"gorm_api_user2/g"
	"gorm_api_user2/model"
	"net/http"
	"strconv"
)

func userDelete(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {
	idStr := ps.ByName("id")
	id, _ := strconv.Atoi(idStr)

	g.GDB.Delete(&model.User{Id: id})

	zdpgo_httprouter.ResponseSuccess(w, nil)
}

package router

import (
	"github.com/zhangdapeng520/zdpgo_httprouter"
	"io"
	"os"
	"testing"
)

func TestUserDelete(t *testing.T) {
	targetUrl := "http://127.0.0.1:8888/user/4"
	data := map[string]interface{}{}
	resp, err := zdpgo_httprouter.SendJson("DELETE", targetUrl, data)
	if err != nil {
		t.Error(err)
	}
	io.Copy(os.Stdout, resp.Body)
}

总结

整个课程从如何连接MySQL讲起,讲解gorm的增删改查常见操作,然后结合REST API接口开发的知识,开发一个用户管理系统的后端API服务,层层递进,学习路径平缓。

通过本套课程,能帮你入门Go语言加gorm框架开发后端REST API接口服务的技术。

如果您需要完整的源码,打赏20元即可。

人生苦短,我用PyGo,我是您身边的Python私教~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1978395.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工业人工智能真的能落地吗?

文章目录 前言Part1 聊聊技术1 人工智能、机器学习和深度学习的关系2 优化思想的一个案例 part2 聊聊业务3 工业人工智能与消费互联网人工智能的区别3.1 消费互联网中人工智能的应用3.2 为什么如此成熟的消费互联网人工智能扩展到工业场景那么难 4 工业互联网人工智能的发展方向…

wxPython中wx.adv.DatePickerCtrl用法

wx.adv.DatePickerCtrl是一个日期选择组件,支持键盘手工录入日期和弹出日历窗口选择日期两种方式。 一、组件样式 wx.adv.DP_SPIN : 只允许键盘手工录入和组件右侧上下箭头调整日期。 wx.adv.DP_DROPDOWN : 只允许健盘手工录入和组件右侧打开…

CentOS7 编译ffmpeg wasm库

1. 安装 emscripten 1)克隆 emsdk git clone https://github.com/emscripten-core/emsdk.git 2)cd 到emsdk 3)安装,按照官网的步骤(Download and install — Emscripten 3.1.65-git (dev) documentation) 4)验证 注意:如果emcc -v 报错: 提示是python脚本错误,是因为…

Qt Modbus 寄存器读写实例

一.线圈状态寄存器读写 项目效果如下 1. 写单个寄存器 MODBUS_API int modbus_write_bit(modbus_t *ctx, int coil_addr, int status); int addrui->spinBoxwirte_addr->value();int dataui->spinBoxwirte_data->value();int ret modbus_write_bit(mb,addr,d…

【Qt】Qt日志信息处理

Qt日志信息处理 一、介绍二、相关函数的使用介绍1. qInstallMessageHandle2. QtMsgType3. QMessageLogContext 三、一个简单示例 一、介绍 Qt有Info、Debug、Warning、Critical、Fatal五种级别的调试信息。 Info: 提示信息qDebug:调试信息qWarning:警告…

目标检测——X光安检数据集

1. OPIXray数据集(2020) 2. HIXray数据集(2021) 3. SIXray数据集(2019) 4. CLCXray数据集(2022) 5. PIDray数据集(2021) 6. GDXray数据集(20…

C++-引用,inline,nullptr

一,引用 1.1引用的概念与定义 引用不是新定义⼀个变量,而是给已存在变量取了⼀个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同⼀块内存空间。 引用的使用方式如下: 类型& 引用别名 引用对象…

【带你入门生信】什么是生物信息学

生物信息学 生物信息学:利用应用数学、信息学、统计学和计算机科学,对生物学数据进行搜索(收集和筛选)、处理(编辑、整理、管理和显示)及分析(计算和模拟),提取生物信息…

一键生成原创文案,轻松成为文案高手的方法

当下时代,文案写作对于各个企业推广产品和服务显得隔外重要。优秀的文案能够吸引用户的注意力,激发购买欲望,从而为企业带来更多的销售机会。然而,对于许多人来说,撰写出一篇吸引人的原创文案可能并不容易。但是&#…

【C++】C++11之新的类功能与可变参数模板

目录 一、新的默认成员函数 二、新的关键字 2.1 default 2.2 detele 2.3 final和override 三、可变参数模板 3.1 定义 3.2 递归展开参数包 3.3 逗号表达式展开参数包 3.4 emplace_back 一、新的默认成员函数 在C11之前,默认成员函数只有六个,…

2024华数杯选题建议-建模思路-代码论文助攻

你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的数学建模团队,我们将为你带来2024 华数杯的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解析,帮助你全面理解并掌握如何…

C:关于static 和 extern 关键字的介绍-学习笔记

目录 1、作用域与生命周期 1.1 作用域 1.2 生命周期 1.3 变量的作用域和生命周期之间的关系 2、static 和 extern 2.1 static 修饰局部变量: 2.2 static 修饰全局变量(包含extern的作用): 2.3 static修饰函数&#xff1a…

海思RTSP推流第二篇——海思平台和H264编码Demo

前言: 记得行内一个老师说过,基础不牢,地动山摇,对于海思的编码过程还是不是很熟悉所以回头把这个分析一遍。 海思平台: 官方手册:HiMPP IPC V2.0 媒体处理软件开发参考,里面有介绍海思IPC平台的…

polyfit曲线拟合

一、简介 polyfit函数是matlab中用于进行曲线拟合的一个函数。其数学基础是最小二乘法曲线拟合原理。曲线拟合:已知离散点上的数据集,即已知在点集上的函数值,构造一个解析函数(其图形为一曲线)使在原离散点上尽可能接…

深度学习 —— 个人学习笔记10(池化层、LeNet)

声明 本文章为个人学习使用,版面观感若有不适请谅解,文中知识仅代表个人观点,若出现错误,欢迎各位批评指正。 二十一、池化层 1、 最大池化层和平均池化层 与互相关运算符一样,汇聚窗口从输入张量的左上角开始&#…

打靶记录6——靶机EvilBox---One

靶机下载地址 https://www.vulnhub.com/entry/evilbox-one,736/学习记录 在进行目录爆破和文件爆破的过程当中,如果有发现新的路径,一定要对新的路径再次进行更深层次的爆破虚拟机出现问题就删除掉,重新导入虚拟机 目标: 获取两个flag&am…

如何准备专利申请书的摘要部分?

如何准备专利申请书的摘要部分?

基于概率神经网络的异方差不确定性估计

目录 摘要1 介绍2 预热3 分析3.1对称性和特征非线性3.2逆方差加权有效欠样本 4 方法5 实验5.1合成数据集5.2真实数据集6 结论 摘要 捕获任意不确定性是许多机器学习系统的关键部分。在深度学习中,达到这一目的的一种常用方法是训练神经网络,通过最大化观…

力扣SQL50 组合两个表 入门基础连表查询

Problem: 175. 组合两个表 select FirstName, LastName, City, State from Person left join Address on Person.PersonId Address.PersonId ;

AI说 | 如何入门AI行业,成为人工智能产品经理?(上)

这周在上海出差,划个水,发一篇之前写的文章,谈谈如何入门AI行业 另外,有朋友说我的文章读起来很累,自我反思,确实写的太长,后面我会在保证有趣或有干货的情况下,将文章内容尽量减短…