golang项目数据库工程化接入
·
接入数据库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数据库,下个章节我们继续讲怎么安装数据库,以及数据库使用什么工具进行管理,已经数据库库表字段等的创建流程

更多推荐

所有评论(0)