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。