Gorm框架 自动建表(Migration特性)

Gorm 支持 Migration 特性,支持根据 Go Struct 结构自动生成对应的表结构。

Gorm 的 AutoMigrate 函数,仅支持建表,不支持修改字段和删除字段,避免意外导致丢失数据。

 

1. 自动建表

通过 AutoMigrate 函数可以快速建表,如果表已经存在不会重复创建。

// 根据 User 结构体,自动创建表结构.
db.AutoMigrate(&User{})

// 一次创建 User、Product、Order 三个结构体对应的表结构
db.AutoMigrate(&User{}, &Product{}, &Order{})

// 可以通过Set设置附加参数,下面设置表的存储引擎为InnoDB
db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{})

 

2. Schema方法

1)检测表是否存在

// 检测User结构体对应的表是否存在
db.Migrator().HasTable(&User{})

// 检测表名users是否存在
db.Migrator().HasTable("users")

2)建表

// 根据User结构体建表
db.Migrator().CreateTable(&User{})

3)删除表

// 删除User结构体对应的表
db.Migrator().DropTable(&User{})

// 删除表名为users的表
db.Migrator().DropTable("users")

4)删除字段

// 删除User结构体对应表中的description字段
db.Migrator().DropColumn(&User{}, "Name")

5)添加索引

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")

 

3. 组合索引

两个字段使用同一个索引名,Migration将创建复合索引,例如:

type User struct {
    Name   string `gorm:"index:idx_member"`
    Number string `gorm:"index:idx_member"`
}

如果在执行SQL查询的时候,出现错误,Gorm 会将错误信息保存到 *gorm.DB 的Error字段,我们只要检测 Error 字段就可以知道是否存在错误。ErrRecordNotFound error:当 First、Last、Take 方法找不到记录时,Gorm 会返回 ErrRecordNotFound 错误。如果发生了多个错误,你可以通过 errors.Is 判断错误是否为 ErrRecordNotFound。