2. GORM 环境搭建:Go 语言环境配置、GORM 库安装、数据库驱动选择与初始项目结构
在开始使用 GORM 进行数据库迁移与领域边界设计之前,必须搭建一个稳定、可复现的开发环境。本章将引导你完成从 Go 语言环境配置到 GORM 库安装、数据库驱动选择以及初始项目结构设计的全过程。一个规范的环境搭建是后续所有迁移契约与领域边界设计的基础。
2.1 Go 语言环境配置
GORM 是 Go 语言生态中的 ORM 库,因此首先需要确保 Go 开发环境正确安装并配置。推荐使用 Go 1.18 及以上版本,以支持泛型等现代特性。
2.1.1 安装与验证
- 下载安装包:访问
https://go.dev/dl/,根据操作系统选择对应的安装包(Windows 选择 .msi,macOS 选择 .pkg,Linux 选择 .tar.gz)。 - 配置环境变量:确保
GOROOT(Go 安装路径)和GOPATH(工作区路径)正确设置。通常安装程序会自动配置,但建议手动检查。 - 验证安装:在终端执行以下命令,确认版本信息。
go version
# 输出示例:go version go1.21.5 darwin/arm64
go env GOPATH
# 输出示例:/Users/username/go
2.1.2 Go Modules 初始化
从 Go 1.11 开始,Go Modules 成为官方推荐的依赖管理方式。在项目根目录执行以下命令初始化模块:
mkdir gorm-migration-lab
cd gorm-migration-lab
go mod init gorm-migration-lab
执行后,目录下会生成 go.mod 文件,记录项目名称与 Go 版本。
2.2 GORM 库安装与数据库驱动选择
GORM 本身是一个纯 Go 库,不直接包含数据库驱动。你需要根据实际使用的数据库类型,安装对应的驱动。下表列出了主流数据库的驱动选择与安装命令:
| 数据库类型 | 驱动包路径 | 安装命令 | 适用场景 |
|---|---|---|---|
| MySQL | gorm.io/driver/mysql |
go get gorm.io/driver/mysql |
生产环境、高并发、事务密集型 |
| PostgreSQL | gorm.io/driver/postgres |
go get gorm.io/driver/postgres |
复杂查询、地理空间数据、JSON 支持 |
| SQLite | gorm.io/driver/sqlite |
go get gorm.io/driver/sqlite |
本地开发、单元测试、嵌入式场景 |
2.2.1 安装 GORM 核心库
无论选择哪种数据库,都需要先安装 GORM 核心库:
go get -u gorm.io/gorm
该命令会下载 GORM 核心包及其依赖,并自动更新 go.mod 和 go.sum 文件。
2.2.2 驱动选择对比
不同数据库驱动在连接方式、DSN 格式、特性支持上存在差异。以下对比表可帮助你根据项目需求做出选择:
| 对比维度 | MySQL | PostgreSQL | SQLite |
|---|---|---|---|
| DSN 示例 | user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True |
host=localhost user=user password=pass dbname=dbname port=5432 sslmode=disable TimeZone=Asia/Shanghai |
/path/to/test.db |
| 迁移特性 | 支持 AutoMigrate,但索引变更有限 | 支持 AutoMigrate,DDL 更丰富 | 支持 AutoMigrate,无并发写限制 |
| 并发支持 | 优秀(连接池) | 优秀(连接池) | 单写多读(文件锁) |
| 推荐场景 | Web 服务、电商、CMS | 数据分析、金融、地理信息 | 原型开发、测试、单机工具 |
2.3 初始项目结构设计
一个清晰的项目结构是领域边界设计的物理体现。以下推荐的结构将数据库迁移、模型定义、业务逻辑与配置分离,便于后续章节的扩展。
2.3.1 推荐目录布局
gorm-migration-lab/
├── cmd/
│ └── migrate/
│ └── main.go # 迁移入口
├── internal/
│ ├── model/ # 领域模型定义
│ │ ├── user.go
│ │ └── order.go
│ ├── repository/ # 数据访问层
│ │ ├── user_repo.go
│ │ └── order_repo.go
│ ├── service/ # 业务逻辑层
│ │ ├── user_service.go
│ │ └── order_service.go
│ └── database/
│ ├── connection.go # 数据库连接初始化
│ └── migration.go # 迁移逻辑封装
├── config/
│ └── config.go # 配置加载
├── go.mod
├── go.sum
└── README.md
2.3.2 各目录职责说明
| 目录/文件 | 职责 | 与迁移的关系 |
|---|---|---|
cmd/migrate/main.go |
迁移命令入口,调用迁移逻辑 | 执行 AutoMigrate 或自定义迁移 |
internal/model/ |
定义 GORM 模型结构体 | 模型是迁移的目标对象 |
internal/database/ |
管理数据库连接与迁移逻辑 | 核心迁移执行单元 |
internal/repository/ |
封装 CRUD 操作 | 依赖已迁移完成的表结构 |
config/ |
读取数据库 DSN 等配置 | 为迁移提供连接参数 |
2.4 环境搭建流程总览
以下 SVG 图展示了从 Go 环境配置到项目结构创建的完整流程,帮助你建立全局视角:
2.5 数据库连接初始化示例
以下代码展示了如何在 internal/database/connection.go 中初始化 GORM 数据库连接,并支持通过环境变量切换数据库驱动:
package database
import (
"fmt"
"os"
"gorm.io/driver/mysql"
"gorm.io/driver/postgres"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
// NewDB 根据环境变量 DB_DRIVER 创建数据库连接
func NewDB() (*gorm.DB, error) {
driver := os.Getenv("DB_DRIVER")
if driver == "" {
driver = "sqlite" // 默认使用 SQLite
}
var dialector gorm.Dialector
switch driver {
case "mysql":
dsn := os.Getenv("DB_DSN")
if dsn == "" {
dsn = "root:password@tcp(127.0.0.1:3306)/gorm_lab?charset=utf8mb4&parseTime=True"
}
dialector = mysql.Open(dsn)
case "postgres":
dsn := os.Getenv("DB_DSN")
if dsn == "" {
dsn = "host=localhost user=gorm password=gorm dbname=gorm_lab port=5432 sslmode=disable"
}
dialector = postgres.Open(dsn)
default:
// SQLite 默认使用内存数据库,便于测试
dialector = sqlite.Open("file::memory:?cache=shared")
}
db, err := gorm.Open(dialector, &gorm.Config{})
if err != nil {
return nil, fmt.Errorf("failed to connect database: %w", err)
}
return db, nil
}
2.6 验证环境搭建
完成上述步骤后,在 cmd/migrate/main.go 中编写以下代码,验证 GORM 能否正常连接数据库并执行自动迁移:
package main
import (
"log"
"gorm-migration-lab/internal/database"
"gorm-migration-lab/internal/model"
)
func main() {
db, err := database.NewDB()
if err != nil {
log.Fatalf("数据库连接失败: %v", err)
}
// 执行自动迁移
err = db.AutoMigrate(&model.User{}, &model.Order{})
if err != nil {
log.Fatalf("自动迁移失败: %v", err)
}
log.Println("环境搭建成功!数据库迁移已完成。")
}
执行 go run cmd/migrate/main.go,如果控制台输出 环境搭建成功!数据库迁移已完成。,则说明整个环境搭建流程正确无误。
2.7 本章小结
通过本章的学习,你已完成以下关键步骤:
- 配置了 Go 语言开发环境并初始化了 Go Modules。
- 安装了 GORM 核心库及对应数据库驱动(MySQL / PostgreSQL / SQLite)。
- 设计了清晰的项目目录结构,将模型、数据库连接、迁移逻辑分层管理。
- 编写了可切换数据库驱动的连接代码,并验证了自动迁移功能。