为了使我的学习更有效率,我决定把 Go 语言操作 MySQL 数据库的完整流程记录下来,包括环境配置、依赖管理、连接池使用和基础 CRUD 操作,帮你避开常见的坑,快速上手开发。
一、环境的准备与路径依赖的配置
1:安装go环境与验证
首先确保你的 Go 环境正常(Go 1.16+ 推荐),在终端执行:
go version
# 输出类似:go version go1.26.1 windows/amd64
2:初始化go模块
在项目根目录执行,创建go.mod文件:
go mod init backend_project
3:安装grom与mysql驱动
GORM 是 Go 语言最流行的 ORM 库,我们用它来简化数据库操作
# 安装GORM核心库
go get gorm.io/gorm
# 安装MySQL驱动
go get gorm.io/driver/mysql
执行完后,用go mod tidy自动补全依赖并生成go.sum文件,解决你之前遇到的依赖缺失问题。
二、数据库连接配置
1:基础连接示例
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
)
func main() {
// 1. 拼接DSN(数据源名称)
dsn := "root:你的密码@tcp(127.0.0.1:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
// 2. 连接数据库
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatalf("数据库连接失败: %v", err)
}
log.Println("数据库连接成功!")
}
2:连接池配置(生产环境必看)
为了避免连接泄漏,建议配置连接池参数:
sqlDB, err := db.DB()
if err != nil {
log.Fatal(err)
}
// 设置最大打开连接数
sqlDB.SetMaxOpenConns(100)
// 设置最大空闲连接数
sqlDB.SetMaxIdleConns(10)
// 设置连接最大存活时间
sqlDB.SetConnMaxLifetime(300)
三、模型定义与表创建
定义一个用户表模型,GORM 会自动帮你创建表:
type User struct {
gorm.Model // 自带ID、CreatedAt、UpdatedAt、DeletedAt字段
Name string `gorm:"size:20;not null;comment:用户名"`
Age int `gorm:"comment:年龄"`
Email string `gorm:"size:50;unique;comment:邮箱"`
}
func initTable(db *gorm.DB) {
// 自动迁移表结构(不存在则创建,存在则更新字段)
err := db.AutoMigrate(&User{})
if err != nil {
log.Fatalf("表创建失败: %v", err)
}
log.Println("用户表创建/迁移成功!")
}
四、基础 CRUD 操作实战
1:新增数据
func createUser(db *gorm.DB) {
user := User{
Name: "张三",
Age: 20,
Email: "zhangsan@example.com",
}
result := db.Create(&user)
if result.Error != nil {
log.Printf("新增用户失败: %v", result.Error)
return
}
log.Printf("新增用户成功,ID: %d", user.ID)
}
2:查询数据
func queryUser(db *gorm.DB) {
var user User
// 根据主键查询
db.First(&user, 1)
log.Printf("查询到用户: %+v", user)
// 条件查询
var users []User
db.Where("age > ?", 18).Find(&users)
log.Printf("18岁以上用户数量: %d", len(users))
}
3:更新数据
func updateUser(db *gorm.DB) {
// 单个字段更新
db.Model(&User{}).Where("id = ?", 1).Update("age", 21)
// 多字段更新
user := User{Name: "张三改", Age: 22}
db.Model(&user).Where("id = ?", 1).Updates(user)
}
4:删除数据
func deleteUser(db *gorm.DB) {
// 软删除(GORM默认)
db.Delete(&User{}, 1)
// 物理删除
db.Unscoped().Delete(&User{}, 1)
}
五、常见问题与避坑指南
- 依赖缺失报错:执行
go mod tidy自动补全依赖,不要手动修改go.sum文件。 - 连接失败:检查 MySQL 服务是否启动、DSN 中的账号密码 / 端口 / 数据库名是否正确,本地防火墙是否放行 3306 端口。
- 时区问题:DSN 中必须加上
loc=Local,否则时间字段会出现 8 小时时差。 - 多 main 函数冲突:一个 Go 模块里只能有一个
func main(),多个入口文件会导致编译失败。
六、总结
通过这篇文章,你已经基本掌握了 Go 语言使用 GORM 操作 MySQL 的完整流程,从环境配置、连接池设置到基础 CRUD 操作。
3881

被折叠的 条评论
为什么被折叠?



