文章目录
- 前言
- 1. GORM简介
- 2. 安装GORM并连接MySQL
- 2.1 安装GORM和MySQL驱动
- 2.2 连接MySQL
- 3. GORM数据模型(Model)
- 3.1 定义User结构体
- 3.2 自动迁移(AutoMigrate)
- 4. GORM CRUD 操作
- 4.1 插入数据(Create)
- 4.2 查询数据(Read)
- 4.3 更新数据(Update)
- 4.4 删除数据(Delete)
- 5. 进阶功能:事务 & 关联关系
- 5.1 事务操作
- 6. GORM 性能优化
- 6.1 添加索引
- 6.2 批量插入
- 🎯 总结
前言
✅ 适合人群:Go 后端开发者 | 数据库开发者 | 想掌握 GORM 的工程师
✅ 文章亮点:从 安装、基础操作、CRUD、事务、索引优化 到 进阶技巧,全面解析 GORM
✅ 目标:掌握 Go 语言 + MySQL(GORM),开发高效数据库应用!
1. GORM简介
GORM
是Go语言最流行的ORM
框架,它提供了一套强大且简介的数据库操作API,相比database/sql
,它具备以下优势:
✅ 代码简洁:无需手写 SQL,使用链式调用
✅ 支持自动迁移:可自动创建和更新数据库表结构
✅ 支持事务、预加载、钩子函数
✅ 支持多种数据库(MySQL、PostgreSQL、SQLite、SQL Server)
✅ 支持软删除、乐观锁、索引管理
2. 安装GORM并连接MySQL
2.1 安装GORM和MySQL驱动
执行以下命令安装 GORM 和 MySQL 依赖:
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
2.2 连接MySQL
在main.go
中编写数据库连接代码:
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var DB *gorm.DB // 全局数据库实例
func InitDB() {
dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"
var err error
DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("数据库连接失败:" + err.Error())
}
fmt.Println("数据库连接成功!")
}
func main() {
InitDB()
}
📌 替换 root:password
为你的 MySQL 账号密码,testdb
为数据库名称
📌 确保 MySQL 服务已开启,并且testdb
数据库已存在
3. GORM数据模型(Model)
GORM的模型(Model)类似于数据库中的表,每个字段对应表的列。
3.1 定义User结构体
type User struct {
ID uint `gorm:"primaryKey"` // 主键
Name string `gorm:"size:100"` // 名字,最大100字符
Age int // 年龄
Email string `gorm:"unique"` // 邮箱,唯一约束
CreateAt time.Time
}
3.2 自动迁移(AutoMigrate)
GORM支持自动迁移
,可以自动创建表结构。
package main
import (
"fmt"
"time"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type User struct {
ID uint `gorm:"primaryKey"` // 主键
Name string `gorm:"size:100"` // 名字,最大100字符
Age int // 年龄
Email string `gorm:"unique"` // 邮箱,唯一约束
CreateAt time.Time
}
var DB *gorm.DB
func InitDB() {
dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"
var err error
DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("❌ 数据库连接失败:" + err.Error())
}
fmt.Println("✅ 数据库连接成功!")
}
func Migrate() {
err := DB.AutoMigrate(&User{}) // 自动迁移User表
if err != nil {
fmt.Println("数据库迁移失败:", err)
}else {
fmt.Println("数据库迁移成功!")
}
}
func main() {
InitDB()
Migrate()
}
📌 运行 go run main.go
,会自动创建 users
表! 🚀
4. GORM CRUD 操作
4.1 插入数据(Create)
package main
import (
"fmt"
"time"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type User struct {
ID uint `gorm:"primaryKey"` // 主键
Name string `gorm:"size:100"` // 名字,最大100字符
Age int // 年龄
Email string `gorm:"unique"` // 邮箱,唯一约束
CreateAt time.Time
}
var DB *gorm.DB
func InitDB() {
dsn := "root:123456@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"
var err error
DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("❌ 数据库连接失败:" + err.Error())
}
fmt.Println("✅ 数据库连接成功!")
}
func Migrate() {
err := DB.AutoMigrate(&User{}) // 自动迁移User表
if err != nil {
fmt.Println("数据库迁移失败:", err)
} else {
fmt.Println("数据库迁移成功!")
}
}
func CreateUser() {
user := User{Name: "Zhangsan", Age: 18, Email: "ponyma@tencent.com",CreateAt: time.Now()}
result := DB.Create(&user)
if result.Error != nil {
fmt.Println("数据插入失败", result.Error)
} else {
fmt.Println("数据插入成功:", user)
}
}
func main() {
InitDB()
// Migrate()
CreateUser()
}
4.2 查询数据(Read)
func GetUserByID(id int) {
var user User
result := DB.First(&user, id)
if result.Error != nil {
fmt.Println("查询失败:",result.Error)
}else {
fmt.Println("查询成功:",user)
}
}
4.3 更新数据(Update)
func UpdateUser(id int,newAge int) {
result :=DB.Model(&User{}).Where("id = ?",id).Update("age",newAge)
if result.Error != nil {
fmt.Println("数据更新失败:", result.Error)
}else {
fmt.Println("数据更新成功:", result.RowsAffected,"行")
}
}
4.4 删除数据(Delete)
func DeleteUser(id uint) {
result := DB.Delete(&User{}, id)
if result.Error != nil {
fmt.Println("❌ 删除失败:", result.Error)
} else {
fmt.Println("✅ 删除成功:", result.RowsAffected, "行")
}
}
5. 进阶功能:事务 & 关联关系
5.1 事务操作
func TransferFunds(senderID, receiverID uint, amount int) {
tx := DB.Begin() // 开启事务
defer func() {
if r := recover(); r != nil {
tx.Rollback() // 事务回滚
}
}()
sender := User{}
receiver := User{}
if err := tx.First(&sender, senderID).Error; err != nil {
tx.Rollback()
return
}
if err := tx.First(&receiver, receiverID).Error; err != nil {
tx.Rollback()
return
}
// 模拟扣款
sender.Age -= amount
receiver.Age += amount
if err := tx.Save(&sender).Error; err != nil {
tx.Rollback()
return
}
if err := tx.Save(&receiver).Error; err != nil {
tx.Rollback()
return
}
tx.Commit() // 提交事务
}
6. GORM 性能优化
6.1 添加索引
type Product struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"index"` // 索引
Price float64
}
6.2 批量插入
func BatchInsertUsers(users []User) {
DB.Create(&users)
}
🎯 总结
✅ 学习了 GORM 基础:安装、连接 MySQL、定义 Model
✅ 掌握了 CRUD 操作:插入、查询、更新、删除
✅ 实现了事务操作,防止数据不一致
✅ 了解了索引优化 & 性能优化
🔥 现在,你已经掌握了 Go + MySQL(GORM)的完整开发流程! 🚀