红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【GORM】迁移

迁移

自动迁移

AutoMigrate用于自动迁移数据库结构,保证最新

它会自动创建表,缺失的外键、约束、列和索引,不会删除未使用的列

1
2
db.AutoMigrate(&User{})
db.AutoMigrate(&User{}, &Product{}, &Order{})

Migrator接口

GORM提供了Migrator接口,为每个数据库都提供了同一的API接口,可以实现更精细的迁移

数据库

db.Migrator().CurrentDatabase()返回当前使用的数据库名

操作 语法
检查表是否存在 db.Migrator().HasTable(&User{})
删除表 db.Migrator().DropTable(&User{})
创建表 db.Migrator().CreateTable(&User{})
重命名表 db.Migrator().RenameTable(&User{}, &UserInfo{})

操作 语法
删除列 db.Migrator().DropColumn(&User{}, "phone")
创建索引 db.Migrator().CreateIndex(&User{}, "idx_name")
添加列 db.Migrator().AddColumn(&User{}, "phone")
修改列 db.Migrator().AlterColumn(&User{}, “Name”)
检查是否存在 db.Migrator().HasColumn(&User{}, “Name”)
字段重命名 db.Migrator().RenameColumn(&User{}, “Name”, “NewName”)
字段类型 db.Migrator().ColumnTypes(&User{}) ([]gorm.ColumnType, error)

视图

操作 语法
创建或覆盖视图 db.Migrator().CreateView("users_pets", gorm.ViewOption{Query: query, Replace: true})
带检查选项 db.Migrator().CreateView("users_pets", gorm.ViewOption{Query: query, CheckOption: "WITH CHECK OPTION"})
删除视图 db.Migrator().DropView("users_pets")

其中提供的query是一个查询构建器,写查询代码赋值给他即可, 或直接在Query后面写查询代码

约束

操作 语法
检查约束是否存在 db.Migrator().HasConstraint(&User{}, "name_checker")
删除约束 db.Migrator().DropConstraint(&User{}, "name_checker")
创建约束 db.Migrator().CreateConstraint(&User{}, "name_checker")

大部分约束可以在结构体标签上实现,涉及外键之类的约束需要手动管理

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
type User struct {
  gorm.Model
  CreditCards []CreditCard
}

type CreditCard struct {
  gorm.Model
  Number string
  UserID uint
}

// create database foreign key for user & credit_cards
db.Migrator().CreateConstraint(&User{}, "CreditCards")
db.Migrator().CreateConstraint(&User{}, "fk_users_credit_cards")
// ALTER TABLE `credit_cards` ADD CONSTRAINT `fk_users_credit_cards` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`)

// check database foreign key for user & credit_cards exists or not
db.Migrator().HasConstraint(&User{}, "CreditCards")
db.Migrator().HasConstraint(&User{}, "fk_users_credit_cards")

// drop database foreign key for user & credit_cards
db.Migrator().DropConstraint(&User{}, "CreditCards")
db.Migrator().DropConstraint(&User{}, "fk_users_credit_cards")

索引

操作 语法
检查索引是否存在 db.Migrator().HasIndex(&User{}, "Name")
删除索引 db.Migrator().DropIndex(&User{}, "Name")
创建索引 db.Migrator().CreateIndex(&User{}, “Name”)
重命名索引 db.Migrator().RenameIndex(&User{}, “Name”, “Name2”)