GORM-数据迁移与模型管理

1. 数据迁移简介

数据迁移主要用于以下场景:

  • 自动创建或更新数据库表。
  • 管理表的索引、外键等结构。
  • 删除或重命名表或字段。

自动迁移

AutoMigrate 是 GORM 提供的自动迁移功能,用于根据模型定义创建或更新数据库表。

示例:自动迁移

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main

import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
)

type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:100"`
Email string `gorm:"unique"`
}

func main() {
dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatalf("Failed to connect to database: %v", err)
}

// 自动迁移
db.AutoMigrate(&User{})
log.Println("Migration completed.")
}

2. 更新表结构

当模型发生变化时,AutoMigrate 会自动同步表结构。例如:

  • 添加新字段。
  • 删除未使用字段(不会自动删除,需要手动管理)。
  • 更新字段属性。

示例:新增字段

在模型中添加字段:

1
2
3
4
5
6
type User struct {
ID uint `gorm:"primaryKey"`
Name string
Email string
Age int // 新增字段
}

运行 AutoMigrate 后,数据库表会自动更新以包含 Age 字段。


3. 索引与约束

GORM 支持为表添加索引和约束,例如唯一索引、普通索引等。

添加索引

1
2
3
4
5
type User struct {
ID uint
Name string `gorm:"index"` // 普通索引
Email string `gorm:"uniqueIndex"` // 唯一索引
}

添加外键

1
2
3
4
type Profile struct {
ID uint
UserID uint `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
}
  • OnUpdate:CASCADE:更新主表时级联更新。
  • OnDelete:SET NULL:删除主表记录时设置为 NULL。

4. 删除与重命名

删除表

使用 Migrator 删除表:

1
db.Migrator().DropTable(&User{})

重命名字段

通过 Migrator 修改字段:

1
db.Migrator().RenameColumn(&User{}, "OldName", "NewName")

5. 管理多模型迁移

示例:迁移多个模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type Article struct {
ID uint `gorm:"primaryKey"`
Title string
Body string
}

type Comment struct {
ID uint `gorm:"primaryKey"`
ArticleID uint
Content string
}

func main() {
db.AutoMigrate(&Article{}, &Comment{})
}

6. 最佳实践

  • 使用事务:将迁移操作包装在事务中以确保数据安全。
  • 备份数据库:在进行重大迁移前,始终备份数据库。
  • 版本控制:使用迁移工具(如 golang-migrate)记录迁移历史,便于团队协作。

7. 总结

GORM 的数据迁移功能使得数据库模式管理更加便捷:

  • AutoMigrate:根据模型自动创建或更新表。
  • 索引与约束:支持索引、外键等结构的定义。
  • 手动迁移:通过 Migrator 进行高级表操作。