2. 环境准备:Go语言环境搭建、GORM库安装、MySQL/PostgreSQL驱动安装、数据库连接配置
本章是《GORM数据库迁移冒烟回归实战课程》的基石环节。只有正确搭建开发环境、安装依赖库并完成数据库连接配置,后续的迁移脚本编写、冒烟测试执行和回归验证才能顺利开展。本节将按照“语言环境 → 依赖管理 → 驱动安装 → 连接配置”的递进路线,确保每位学员都能获得一致的、可复现的实验环境。
2.1 Go语言环境搭建
GORM 是基于 Go 语言的 ORM 框架,因此 Go 环境是首要前提。推荐使用 Go 1.21 及以上版本,以获得对泛型、错误处理等特性的完整支持。
| 操作系统 | 下载与安装方式 | 验证命令 |
|---|---|---|
| Windows | 访问 go.dev/dl 下载 MSI 安装包,双击安装 |
go version |
| macOS | 使用 Homebrew:brew install go |
go version |
| Linux (Ubuntu/Debian) | 下载 tar.gz 解压至 /usr/local,配置 PATH |
go version |
环境变量检查清单:
GOROOT:指向 Go 安装目录(如/usr/local/go)GOPATH:指向工作区目录(如$HOME/go)PATH:必须包含$GOROOT/bin和$GOPATH/bin
# 验证 Go 环境
$ go version
go version go1.22.2 linux/amd64
# 查看环境变量
$ go env GOPATH GOROOT
/home/learner/go
/usr/local/go
2.2 GORM库安装
GORM 采用 Go Modules 进行依赖管理。在项目根目录初始化模块后,通过 go get 命令拉取 GORM 核心库。
# 初始化项目模块(模块名自定义,如 gorm-migration-course)
$ mkdir gorm-migration-course && cd gorm-migration-course
$ go mod init gorm-migration-course
# 安装 GORM 核心库
$ go get -u gorm.io/gorm
安装完成后,go.mod 文件中会自动记录 GORM 版本依赖。建议锁定版本号,避免因自动升级导致行为不一致。
版本锁定建议: 在
go.mod 中将 gorm.io/gorm 的版本号固定为 v1.25.12 或更高稳定版,并在团队内统一使用。
2.3 数据库驱动安装
GORM 本身不直接操作数据库,而是通过数据库驱动与具体数据库交互。本课程同时支持 MySQL 和 PostgreSQL,学员可根据实际环境选择安装。
| 数据库 | 驱动包路径 | 安装命令 |
|---|---|---|
| MySQL | gorm.io/driver/mysql |
go get -u gorm.io/driver/mysql |
| PostgreSQL | gorm.io/driver/postgres |
go get -u gorm.io/driver/postgres |
常见陷阱: 不要同时安装两个驱动后忘记在代码中指定正确的 DSN 格式。MySQL 使用
charset=utf8mb4&parseTime=True,PostgreSQL 使用 sslmode=disable TimeZone=Asia/Shanghai,混用会导致连接失败。
2.4 数据库连接配置
连接配置是环境准备的核心环节。GORM 通过 gorm.Open 函数接收驱动实例和配置选项。以下分别给出 MySQL 和 PostgreSQL 的标准连接示例。
2.4.1 MySQL 连接示例
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
dsn := "root:password@tcp(127.0.0.1:3306)/migration_db?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// db 即为可用的 GORM 数据库实例
}
2.4.2 PostgreSQL 连接示例
package main
import (
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
func main() {
dsn := "host=localhost user=postgres password=secret dbname=migration_db port=5432 sslmode=disable TimeZone=Asia/Shanghai"
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// db 即为可用的 GORM 数据库实例
}
连接池配置建议: 生产环境应通过
sql.DB 对象设置连接池参数,如 SetMaxOpenConns(25)、SetMaxIdleConns(10)、SetConnMaxLifetime(5 * time.Minute)。GORM 的 db.DB() 方法可获取底层 *sql.DB。
2.5 环境验证与冒烟检查
完成上述步骤后,执行一次简单的数据库连接与建表操作,验证整个链路是否通畅。这是冒烟回归理念在环境准备阶段的最小化验证。
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type SmokeTest struct {
ID uint
Name string
}
func main() {
dsn := "root:password@tcp(127.0.0.1:3306)/migration_db?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
fmt.Println("❌ 数据库连接失败:", err)
return
}
// 自动迁移(建表)
err = db.AutoMigrate(&SmokeTest{})
if err != nil {
fmt.Println("❌ 自动迁移失败:", err)
return
}
// 插入一条记录
db.Create(&SmokeTest{Name: "env-smoke"})
// 查询验证
var result SmokeTest
db.First(&result, "name = ?", "env-smoke")
fmt.Printf("✅ 环境冒烟通过,记录ID=%d, Name=%s\n", result.ID, result.Name)
}
冒烟通过标准: 控制台输出
✅ 环境冒烟通过,且数据库中 smoke_tests 表存在并包含一条 Name='env-smoke' 的记录。
2.6 常见问题与排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
dial tcp: connect: connection refused |
数据库服务未启动或端口错误 | 检查 systemctl status mysql 或 pg_isready |
access denied for user |
用户名或密码错误 | 确认 DSN 中的用户凭据,或使用 mysql -u root -p 测试 |
unknown database |
指定的数据库不存在 | 先手动创建数据库:CREATE DATABASE migration_db; |
invalid DSN |
DSN 格式不符合驱动要求 | 对照官方文档检查参数分隔符和关键字 |
安全提醒: 切勿将包含明文密码的 DSN 提交到版本控制系统。建议使用环境变量或配置文件(如
.env)管理敏感信息,并在 .gitignore 中排除。