迁移
自动迁移
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”) |