1. 自动迁移
在包 “github.com/jinzhu/gorm” 中
gorm 使用方法 gorm.AutoMigrate 来自动迁表格,说白了就是用已有的结构类型来创建一个表格,表格中的每一列都是结构中所含的字段。AutoMigrate 的入参为指向一个结构类型的指针。
type UserInfo struct {gorm.ModelName stringGender stringHobby string}func main() {db, err := gorm.Open("mysql", "root:root1234@(127.0.0.1:13306)/db1?charset=utf8mb4&parseTime=True&loc=Local")if err!= nil{panic(err)}defer db.Close()// 自动迁移db.AutoMigrate(&UserInfo{})}
来看看官方文档里对 AutoMigrate是怎么说的:<br />
2. Migrator 接口
在 “gorm.io/gorm” 包中,提供了Migrator 接口,该接口为每个数据库提供了统一的 API 接口,可用来为数据库构建独立迁移。
但是注意,该接口在 “github.com/jinzhu/gorm” 中没有!
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) errorHasColumn(dst interface{}, field string) boolRenameColumn(dst interface{}, oldName, field string) errorMigrateColumn(dst interface{}, field *schema.Field, columnType *sql.ColumnType) errorColumnTypes(dst interface{}) ([]*sql.ColumnType, 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}
2.1 获取当前数据库
返回当前使用的数据库名
db.Migrator().CurrentDatabase()
2.2 表
// 为 `User` 创建表db.Migrator().CreateTable(&User{})// 将 "ENGINE=InnoDB" 添加到创建 `User` 的 SQL 里去db.Set("gorm:table_options", "ENGINE=InnoDB").Migrator().CreateTable(&User{})// 检查 `User` 对应的表是否存在db.Migrator().HasTable(&User{})db.Migrator().HasTable("users")// 如果存在表则删除(删除时会忽略、删除外键约束)db.Migrator().DropTable(&User{})db.Migrator().DropTable("users")// 重命名表db.Migrator().RenameTable(&User{}, &UserInfo{})db.Migrator().RenameTable("users", "user_infos")
2.3 列
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 stringNewName string}// 重命名字段db.Migrator().RenameColumn(&User{}, "Name", "NewName")db.Migrator().RenameColumn(&User{}, "name", "new_name")// 获取字段类型db.Migrator().ColumnTypes(&User{}) ([]*sql.ColumnType, error)
2.4 约束
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"
为 relation 创建外键
type User struct {gorm.ModelCreditCards []CreditCard}type CreditCard struct {gorm.ModelNumber stringUserID uint}// 为 user & credit_cards 创建 db 外键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`)// 检查 user & credit_cards 的外键是否存在db.Migrator().HasConstraint(&User{}, "CreditCards")db.Migrator().HasConstraint(&User{}, "fk_users_credit_cards")// 删除 user & credit_cards 的 db 外键db.Migrator().DropConstraint(&User{}, "CreditCards")db.Migrator().DropConstraint(&User{}, "fk_users_credit_cards")
2.5 索引
type User struct {gorm.ModelName 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.ModelName 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")
