接入数据库mysql

  • 引入相关包即可
go get gorm.io/driver/mysql
go get gorm.io/gorm
go get gorm.io/gorm/logger
  • 创建一个配置config目录,专门放一些配置文件,在目录里面创建一个mysql的配置文件mysql.go内容是
package config

import (
	"context"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"log"
	"time"
)

// 全局DB对象,整个项目都能用
var DB *gorm.DB

// InitMySQL 初始化数据库连接
func InitMySQL() {
	// DSN 数据库连接串 【你改成自己的账号密码】
	dsn := "root:123456@tcp(127.0.0.1:3306)/go_demo?charset=utf8mb4&parseTime=True&loc=Local"

	// 日志配置
	newLogger := logger.New(
		log.New(log.Writer(), "\n", log.LstdFlags),
		logger.Config{
			SlowThreshold: time.Second,
			LogLevel:      logger.Info,
		},
	)

	// 连接数据库
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		Logger: newLogger,
	})
	if err != nil {
		log.Fatal("数据库连接失败:", err)
	}

	// 设置连接池,就是需要数据库连接时,直接从连接池中获取数据库连接,不用新创建数据库连接,节省资源
	sqlDB, _ := db.DB()
	sqlDB.SetMaxIdleConns(10)
	sqlDB.SetMaxOpenConns(100)
	sqlDB.SetConnMaxLifetime(30 * time.Minute)

	// 赋值给全局DB
	DB = db
	log.Println("✅ MySQL 连接成功")
}

// GetDB 获取全局DB
func GetDB(ctx context.Context) *gorm.DB {
	return DB.WithContext(ctx)
}

在路由方法中如何使用这个DB对象

  • 一般在模型中操作数据库,不在控制器(路由方法中直接操作数据库),这是一种编程思维,控制器+模型+视图(我们这里其实可以将小程序前端界面当成视图)MVC模式,其目的是解耦,易于维护和分工开发
  • 先创建一个模型目录,模型目录中放各个数据表对应的模型文件,一般就是一个文件对应一个表,我们先创建一个用户表模型
package model

// User 用户表结构
type User struct {
	ID   uint   `gorm:"primaryKey" json:"id"`
	Name string `gorm:"size:20" json:"name"`
	Age  int    `gorm:"size:3" json:"age"`
}

// TableName 表名
func (User) TableName() string {
	return "user"
}

在模型之外我们单独封装一个数据访问层dao

  • 所谓数据访问层,是与业务挂钩的数据库操作方法(基本上就是增删改查)
  • 还是以用户模型为例,创建一个用户数据访问层user_dao.go
package dao

import (
	"gin-project/config"
	"gin-project/model"
)

// GetUserByID 根据ID获取用户
func GetUserByID(id uint) (model.User, error) {
	var user model.User
	err := config.DB.First(&user, id).Error
	return user, err
}

// CreateUser 创建用户
func CreateUser(user *model.User) error {
	return config.DB.Create(user).Error
}
// DeleteUser 删除用户

// UpdateUser 更新用户信息
func UpdateUser(id uint, user model.User) error {
	return config.DB.Model(&model.User{}).Where("id = ?", id).Updates(user).Error
}

将路由方法改动一下加入数据操作

  • 用户路由修改
package api

import (
	"gin-project/common"
	"gin-project/dao"
	"gin-project/model"
	"strconv"

	"github.com/gin-gonic/gin"
)

func GetUserInfo(c *gin.Context) {
    //就是从请求上下文中获取id参数
	idStr := c.Query("id")
	id, _ := strconv.Atoi(idStr)

	user, err := dao.GetUserByID(uint(id))
	if err != nil {
		common.Fail(c, "用户不存在")
		return
	}

	common.Success(c, user)
}

func UpdateUser(c *gin.Context) {
	// 1. 获取用户ID
	idStr := c.Param("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		common.Fail(c, "用户ID格式错误")
		return
	}

	// 2. 绑定前端传来的更新数据
	var user model.User
	if err := c.ShouldBindJSON(&user); err != nil {
		common.Fail(c, "参数错误")
		return
	}

	// 3. 调用DAO更新
	err = dao.UpdateUser(uint(id), user)
	if err != nil {
		common.Fail(c, "更新失败")
		return
	}

	common.Success(c, "更新成功")
}

// AddUser 添加用户
func AddUser(c *gin.Context) {
	var user model.User
	_ = c.ShouldBindJSON(&user)

	err := dao.CreateUser(&user)
	if err != nil {
		common.Fail(c, "创建失败")
		return
	}
	common.Success(c, "创建成功")
}

order订单表也如同用户表一样创建

  • 里面有些需要补传的方法可以结合对照用户表进行创建使用
  • 可以自己跟ai来进行开发

重新运行项目

go run main.og

正常返回,但是现在我们实际还没有装mysql数据库,下个章节我们继续讲怎么安装数据库,以及数据库使用什么工具进行管理,已经数据库库表字段等的创建流程

更多推荐