一架梯子,一头程序猿,仰望星空!

GORM 自动建表(Migration特性)


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

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

自动建表

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

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

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

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

Schema方法

检测表是否存在

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

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

建表

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

// 设置表结构的存储引擎为InnoDB
db.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&User{})

删除表

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

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

// 如果表结构存在则删除User结构体对应的表和名字为products的表
db.DropTableIfExists(&User{}, "products")

修改字段类型

// 将User结构体对应表的description字段类型改为text
db.Model(&User{}).ModifyColumn("description", "text")

删除字段

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

添加索引

// 为User结构体的表结构添加索引idx_user_name, 索引字段为name
db.Model(&User{}).AddIndex("idx_user_name", "name")

// 创建复合索引,索引字段为name和age
db.Model(&User{}).AddIndex("idx_user_name_age", "name", "age")

// 添加唯一索引
db.Model(&User{}).AddUniqueIndex("idx_user_name", "name")

// 添加唯一索引,索引字段为name和age
db.Model(&User{}).AddUniqueIndex("idx_user_name_age", "name", "age")

删除索引

// 删除索引,索引名=idx_user_name
db.Model(&User{}).RemoveIndex("idx_user_name")