AutoMigrate 用于自动迁移您的 schema,保持您的 schema 是最新的。
注意: AutoMigrate 会创建表,缺少的外键,约束,列和索引,并且会更改现有列的类型(如果其大小、精度、是否为空可更改)。但 不会 删除未使用的列,以保护您的数据。
| db.AutoMigrate(&User{})db.AutoMigrate(&User{}, &Product{}, &Order{})// 创建表时添加后缀db.Set(“gorm:table_options”, “ENGINE=InnoDB”).AutoMigrate(&User{}) |
|---|
注意 AutoMigrate 会自动创建数据库外键约束,您可以在初始化时禁用此功能,例如:
| db, err := gorm.Open(sqlite.Open(“gorm.db”), &gorm.Config{ DisableForeignKeyConstraintWhenMigrating: true,}) |
|---|
Migrator 接口
GORM 提供了 Migrator 接口,该接口为每个数据库提供了统一的 API 接口,可用来为您的数据库构建独立迁移,例如:
SQLite 不支持 ALTER COLUMN、DROP COLUMN,当你试图修改表结构,GORM 将创建一个新表、复制所有数据、删除旧表、重命名新表。
一些版本的 MySQL 不支持 rename 列,索引。GORM 将基于您使用 MySQL 的版本执行不同 SQL
type Migrator interface {// AutoMigrateAutoMigrate(dst ...interface{}) error// DatabaseCurrentDatabase() stringFullDataTypeOf(*schema.Field) clause.Expr// TablesCreateTable(dst ...interface{}) errorDropTable(dst ...interface{}) errorHasTable(dst interface{}) boolRenameTable(oldName, newName interface{}) error// ColumnsAddColumn(dst interface{}, field string) errorDropColumn(dst interface{}, field string) errorAlterColumn(dst interface{}, field string) errorMigrateColumn(dst interface{}, field *schema.Field, columnType ColumnType) errorHasColumn(dst interface{}, field string) boolRenameColumn(dst interface{}, oldName, field string) errorColumnTypes(dst interface{}) ([]ColumnType, error)// ViewsCreateView(name string, option ViewOption) errorDropView(name string) error// ConstraintsCreateConstraint(dst interface{}, name string) errorDropConstraint(dst interface{}, name string) errorHasConstraint(dst interface{}, name string) bool// IndexesCreateIndex(dst interface{}, name string) errorDropIndex(dst interface{}, name string) errorHasIndex(dst interface{}, name string) boolRenameIndex(dst interface{}, oldName, newName string) error}
当前数据库
返回当前使用的数据库名
| db.Migrator().CurrentDatabase() |
|---|
表
// Create table for Userdb.Migrator().CreateTable(&User{})// Append “ENGINE=InnoDB” to the creating table SQL for Userdb.Set(“gorm:table_options”, “ENGINE=InnoDB”).Migrator().CreateTable(&User{})// Check table for User exists or notdb.Migrator().HasTable(&User{})db.Migrator().HasTable(“users”)// Drop table if exists (will ignore or delete foreign key constraints when dropping)db.Migrator().DropTable(&User{})db.Migrator().DropTable(“users”)// Rename old table to new tabledb.Migrator().RenameTable(&User{}, &UserInfo{})db.Migrator().RenameTable(“users”, “user_infos”) |
|---|
列
| type User struct { Name string}// 添加 name 字段db.Migrator().AddColumn(&User{}, “Name”)// 删除 name 字段db.Migrator().DropColumn(&User{}, “Name”)// 修改 name 字段db.Migrator().AlterColumn(&User{}, “Name”)// 检查字段是否存在db.Migrator().HasColumn(&User{}, “Name”)type User struct { Name string NewName string}// 重命名字段db.Migrator().RenameColumn(&User{}, “Name”, “NewName”)db.Migrator().RenameColumn(&User{}, “name”, “new_name”)// 获取字段类型db.Migrator().ColumnTypes(&User{}) ([]*sql.ColumnType, error) |
|---|
约束
type UserIndex struct { Name string gorm:"check:name_checker,name <> 'jinzhu'"}// 创建约束db.Migrator().CreateConstraint(&User{}, “name_checker”)// 删除约束db.Migrator().DropConstraint(&User{}, “name_checker”)// 检查约束是否存在db.Migrator().HasConstraint(&User{}, “name_checker”) |
|---|
索引
type User struct { gorm.Model Name string gorm:"size:255;index:idx_name,unique"}// 为 Name 字段创建索引db.Migrator().CreateIndex(&User{}, “Name”)db.Migrator().CreateIndex(&User{}, “idx_name”)// 为 Name 字段删除索引db.Migrator().DropIndex(&User{}, “Name”)db.Migrator().DropIndex(&User{}, “idx_name”)// 检查索引是否存在db.Migrator().HasIndex(&User{}, “Name”)db.Migrator().HasIndex(&User{}, “idx_name”)type User struct { gorm.Model Name string gorm:"size:255;index:idx_name,unique" Name2 string gorm:"size:255;index:idx_name_2,unique"}// 修改索引名db.Migrator().RenameIndex(&User{}, “Name”, “Name2”)db.Migrator().RenameIndex(&User{}, “idx_name”, “idx_name_2”) |
|---|
约束
GORM 会在自动迁移和创建表时创建约束,查看 约束 或 数据库索引 获取详情
其他迁移工具
GORM 的 AutoMigrate 在大多数情况下都工作得很好,但如果您正在寻找更严格的迁移工具,GORM 提供一个通用数据库接口,可能对您有帮助。
// returns *sql.DBdb.DB() |
|---|
查看 通用接口 获取详情。
