3--Gorm-用Golang操作MySQL

为了实现数据库连接和用户表的设计,我们将引入 Go 生态中最强大的 ORM 框架 GORM。通过 GORM,我们可以直接用 Go 的结构体(Struct)来定义数据库表,并在程序启动时自动创建表结构,省去了手写 SQL 建表语句的麻烦。

一. 安装 GORM 及其 MySQL 驱动

首先确保MySQL 8.0已成功安装

在终端(项目根目录下)执行以下命令,下载必要的依赖包:

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

二. 编写数据库配置config

(注意:请提前在你的本地 MySQL 中新建一个名为 secgo_mall 的数据库)

CREATE DATABASE secgo_mall
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

打开 ...\Secgo-Mall\configs\config.yaml文件

在文件末尾补充以下内容:

database:
  host: "127.0.0.1"
  port: 3306
  user: "root"      # 替换为你的 MySQL 账号
  password: "root"  # 替换为你的 MySQL 密码
  dbname: "secgo_mall"

三. 修改 config.go 映射数据库配置

我们需要在配置结构体中加入对 database 节点的解析。

	...
    Mode string `mapstructure:"mode"` // 服务运行模式,支持 "debug"、"release"
} 

// DatabaseConfig 映射yaml文件中的database配置
type DatabaseConfig struct {
    Host     string `mapstructure:"host"`     // 数据库主机地址
    Port     int    `mapstructure:"port"`     // 数据库端口
    User     string `mapstructure:"user"`     // 数据库用户名
    Password string `mapstructure:"password"` // 数据库密码
    DbName   string `mapstructure:"dbname"`   // 数据库名称
}

// Config 是整个项目的配置树
type Config struct {
    Server   ServerConfig   `mapstructure:"server"`   // 服务器相关配置
    Database DatabaseConfig `mapstructure:"database"` // 数据库相关配置
}

// GlobalConfig 定义一个全局变量来存储加载的配置
	...

四. 定义 User 表结构模型

在 GORM 中,表结构是通过 Go 的结构体定义的。我们新建一个模型层目录,并创建 user.go,将你要求的 主键Uid、邮箱、电话号码、密码、注册时间 转化为代码。

...\secgo-mall\internal\model\user.go

package model

import "time"

// User 定义了用户模型,包含ID、用户名、邮箱和密码等字段
type User struct {
    Uid       uint      `gorm:"primaryKey;column:uid;autoIncrement" json:"uid"`            // 用户ID,主键
    Username  string    `gorm:"column:username;type:varchar(20);not null" json:"username"` // 用户名,唯一且不能为空
    Email     string    `gorm:"column:email;type:varchar(100);uniqueIndex" json:"email"`
    Phone     string    `gorm:"column:phone;type:varchar(20);uniqueIndex" json:"phone"`
    Password  string    `gorm:"column:password;type:varchar(255);not null" json:"-"` // json:"-" 在接口返回 JSON 时自动隐藏密码
    CreatedAt time.Time `gorm:"column:created_at;autoCreateTime" json:"created_at"`  // 注册时间,GORM 会在插入时自动填充当前时间
}

// TableName 明确指定 GORM 映射的数据库表名为 user
func (User) TableName() string {
    return "user"
}

五. 编写数据库初始化及自动建表逻辑

接下来创建一个全局的数据库连接,并在程序启动时连接 MySQL,同时利用 GORM 的 AutoMigrate 功能自动在数据库里建表。

...\Secgo-Mall\pinternal\repository\mysql.go

package database

import (
    "fmt"
    "log"

    config "github.com/Chuan81/secgo-mall/configs"
    "github.com/Chuan81/secgo-mall/internal/model"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

// DB 是一个全局变量,用于存储数据库连接实例
var DB *gorm.DB

// InitDB 初始化数据库连接
func InitMySQL() {
    dbCfg := config.GlobalConfig.Database
    
    // 按照 GORM 的要求拼接 MySQL DSN (Data Source Name)
    dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
        dbCfg.User, dbCfg.Password, dbCfg.Host, dbCfg.Port, dbCfg.DbName)
	
	var err error
    DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatalf("Failed to connect to MySQL: %v", err)
    }
    log.Println("MySQL connected successfully.")

    // AutoMigrate 会根据 User 结构体自动创建或更新数据库表结构
    if err := DB.AutoMigrate(&model.User{}); err != nil {
        log.Fatalf("Failed to auto migrate tables: %v", err)
    }
}

六. 在入口文件中调用数据库初始化

最后一步,我们需要在 main.go 中,配置文件加载完成之后,启动服务之前,把数据库给初始化。

    ...
    config.InitConfig()

    // 初始化数据库连接
    database.InitMySQL()

    // 使用全局配置设置Gin的运行模式
    ...

现在你可以再次运行 go run cmd/secgo-mall/main.go

如果控制台打印出 MySQL connected successfully.,你可以去你的数据库可视化工具(如 Navicat、DBeaver)里刷新一下

PS C:\Code\Projects\Secgo-Mall> go run cmd/secgo-mall/main.go   
2026/04/10 17:55:45 MySQL connected successfully.

你就会神奇地发现 secgo_mall 数据库里已经自动建好了一张完整的 user 表!

user表成功创建

posted @ 2026-04-17 17:29  Chuan81  阅读(18)  评论(0)    收藏  举报