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 表!


浙公网安备 33010602011771号