1. 自动迁移

在包 “github.com/jinzhu/gorm”
gorm 使用方法 gorm.AutoMigrate 来自动迁表格,说白了就是用已有的结构类型来创建一个表格,表格中的每一列都是结构中所含的字段。AutoMigrate 的入参为指向一个结构类型的指针。

  1. type UserInfo struct {
  2. gorm.Model
  3. Name string
  4. Gender string
  5. Hobby string
  6. }
  7. func main() {
  8. db, err := gorm.Open("mysql", "root:root1234@(127.0.0.1:13306)/db1?charset=utf8mb4&parseTime=True&loc=Local")
  9. if err!= nil{
  10. panic(err)
  11. }
  12. defer db.Close()
  13. // 自动迁移
  14. db.AutoMigrate(&UserInfo{})
  15. }
  1. 来看看官方文档里对 AutoMigrate是怎么说的:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2643809/1619849820811-25941c4b-2b77-46a5-9032-dfe3247f6e93.png#clientId=u6e274e77-eeed-4&from=paste&height=480&id=u73c3c0dd&margin=%5Bobject%20Object%5D&name=image.png&originHeight=678&originWidth=1036&originalType=binary&size=78130&status=done&style=none&taskId=ue7a54fec-031c-4fbc-97a6-c563b5b58ca&width=734)

2. Migrator 接口

“gorm.io/gorm” 包中,提供了Migrator 接口,该接口为每个数据库提供了统一的 API 接口,可用来为数据库构建独立迁移。
但是注意,该接口在 “github.com/jinzhu/gorm” 中没有!

  1. type Migrator interface {
  2. // AutoMigrate
  3. AutoMigrate(dst ...interface{}) error
  4. // Database
  5. CurrentDatabase() string
  6. FullDataTypeOf(*schema.Field) clause.Expr
  7. // Tables
  8. CreateTable(dst ...interface{}) error
  9. DropTable(dst ...interface{}) error
  10. HasTable(dst interface{}) bool
  11. RenameTable(oldName, newName interface{}) error
  12. // Columns
  13. AddColumn(dst interface{}, field string) error
  14. DropColumn(dst interface{}, field string) error
  15. AlterColumn(dst interface{}, field string) error
  16. HasColumn(dst interface{}, field string) bool
  17. RenameColumn(dst interface{}, oldName, field string) error
  18. MigrateColumn(dst interface{}, field *schema.Field, columnType *sql.ColumnType) error
  19. ColumnTypes(dst interface{}) ([]*sql.ColumnType, error)
  20. // Constraints
  21. CreateConstraint(dst interface{}, name string) error
  22. DropConstraint(dst interface{}, name string) error
  23. HasConstraint(dst interface{}, name string) bool
  24. // Indexes
  25. CreateIndex(dst interface{}, name string) error
  26. DropIndex(dst interface{}, name string) error
  27. HasIndex(dst interface{}, name string) bool
  28. RenameIndex(dst interface{}, oldName, newName string) error
  29. }

2.1 获取当前数据库

返回当前使用的数据库名

  1. db.Migrator().CurrentDatabase()

2.2 表

  1. // 为 `User` 创建表
  2. db.Migrator().CreateTable(&User{})
  3. // 将 "ENGINE=InnoDB" 添加到创建 `User` 的 SQL 里去
  4. db.Set("gorm:table_options", "ENGINE=InnoDB").Migrator().CreateTable(&User{})
  5. // 检查 `User` 对应的表是否存在
  6. db.Migrator().HasTable(&User{})
  7. db.Migrator().HasTable("users")
  8. // 如果存在表则删除(删除时会忽略、删除外键约束)
  9. db.Migrator().DropTable(&User{})
  10. db.Migrator().DropTable("users")
  11. // 重命名表
  12. db.Migrator().RenameTable(&User{}, &UserInfo{})
  13. db.Migrator().RenameTable("users", "user_infos")

2.3 列

  1. type User struct {
  2. Name string
  3. }
  4. // 添加 name 字段
  5. db.Migrator().AddColumn(&User{}, "Name")
  6. // 删除 name 字段
  7. db.Migrator().DropColumn(&User{}, "Name")
  8. // 修改 name 字段
  9. db.Migrator().AlterColumn(&User{}, "Name")
  10. // 检查字段是否存在
  11. db.Migrator().HasColumn(&User{}, "Name")
  12. type User struct {
  13. Name string
  14. NewName string
  15. }
  16. // 重命名字段
  17. db.Migrator().RenameColumn(&User{}, "Name", "NewName")
  18. db.Migrator().RenameColumn(&User{}, "name", "new_name")
  19. // 获取字段类型
  20. db.Migrator().ColumnTypes(&User{}) ([]*sql.ColumnType, error)

2.4 约束

  1. type UserIndex struct {
  2. Name string `gorm:"check:name_checker,name <> 'jinzhu'"`
  3. }
  4. // 创建约束
  5. db.Migrator().CreateConstraint(&User{}, "name_checker")
  6. // 删除约束
  7. db.Migrator().DropConstraint(&User{}, "name_checker")
  8. // 检查约束是否存在
  9. db.Migrator().HasConstraint(&User{}, "name_checker"
  1. relation 创建外键
  1. type User struct {
  2. gorm.Model
  3. CreditCards []CreditCard
  4. }
  5. type CreditCard struct {
  6. gorm.Model
  7. Number string
  8. UserID uint
  9. }
  10. // 为 user & credit_cards 创建 db 外键
  11. db.Migrator().CreateConstraint(&User{}, "CreditCards")
  12. db.Migrator().CreateConstraint(&User{}, "fk_users_credit_cards")
  13. // ALTER TABLE `credit_cards` ADD CONSTRAINT `fk_users_credit_cards` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`)
  14. // 检查 user & credit_cards 的外键是否存在
  15. db.Migrator().HasConstraint(&User{}, "CreditCards")
  16. db.Migrator().HasConstraint(&User{}, "fk_users_credit_cards")
  17. // 删除 user & credit_cards 的 db 外键
  18. db.Migrator().DropConstraint(&User{}, "CreditCards")
  19. db.Migrator().DropConstraint(&User{}, "fk_users_credit_cards")

2.5 索引

  1. type User struct {
  2. gorm.Model
  3. Name string `gorm:"size:255;index:idx_name,unique"`
  4. }
  5. // 为 Name 字段创建索引
  6. db.Migrator().CreateIndex(&User{}, "Name")
  7. db.Migrator().CreateIndex(&User{}, "idx_name")
  8. // 为 Name 字段删除索引
  9. db.Migrator().DropIndex(&User{}, "Name")
  10. db.Migrator().DropIndex(&User{}, "idx_name")
  11. // 检查索引是否存在
  12. db.Migrator().HasIndex(&User{}, "Name")
  13. db.Migrator().HasIndex(&User{}, "idx_name")
  14. type User struct {
  15. gorm.Model
  16. Name string `gorm:"size:255;index:idx_name,unique"`
  17. Name2 string `gorm:"size:255;index:idx_name_2,unique"`
  18. }
  19. // 修改索引名
  20. db.Migrator().RenameIndex(&User{}, "Name", "Name2")
  21. db.Migrator().RenameIndex(&User{}, "idx_name", "idx_name_2")