数据迁移
在开发过程中经常会遇到数据库字段的变更和基础数据的变更,go-admin 也提供了对应的迁移工具;
首先需要将在项目根目录下执行go build
将程序编译:
go build
执行go-admin migrate
指令,可以进行数据迁移;
首次使用时可以使用-h
查看帮助信息;
$ ./go-admin migrate -h
Initialize the database
Usage:
go-admin migrate [flags]
Examples:
go-admin migrate -c config/settings.yml
Flags:
-c, --config string Start server with provided configuration file (default "config/settings.yml")
-d, --domain string select tenant host (default "*")
-g, --generate generate migration file
-a, --goAdmin generate go-admin migration file
-h, --help help for migrate
新建模型
-
首先下载go-admin 在
cmd/migrate/migration/models
目录中添加新的 model 文件,并做好相应的属性;package models type TbDemo struct { Model Name string `json:"name" gorm:"type:varchar(128);comment:名称"` ModelTime ControlBy } func (TbDemo) TableName() string { return "tb_demo" }
上边我们给出了一个简单的
struct
,包含的有Model
、ModelTime
、ControlBy
和Name
属性;
其中Model
、ModelTime
、ControlBy
是 go-admin 默认需要添加的基本属性,Name
是业务属性;
另外还需要定义一个TableName()
的func
用来设置我们的表名称; -
生成迁移文件
首先执行,
$ ./go-admin migrate -a true -g true generate migration file
完成后,我们打开
cmd/migrate/migration/version
目录,这时里边已经为您新添加了一个迁移文件(一般会在最下边),我们打开看一下:package version import ( "gorm.io/gorm" "runtime" "go-admin/cmd/migrate/migration" common "go-admin/common/models" ) func init() { _, fileName, _, _ := runtime.Caller(0) migration.Migrate.SetVersion(migration.GetFilename(fileName), _1654233005296Test) } func _1654233005296Test(db *gorm.DB, version string) error { return db.Transaction(func(tx *gorm.DB) error { // TODO: 这里开始写入要变更的内容 // TODO: 例如 修改表字段 使用过程中请删除此段代码 //err := tx.Migrator().RenameColumn(&models.SysConfig{}, "config_id", "id") //if err != nil { // return err //} // TODO: 例如 新增表结构 使用过程中请删除此段代码 //err = tx.Migrator().AutoMigrate( // new(models.CasbinRule), // ) //if err != nil { // return err //} return tx.Create(&common.Migration{ Version: version, }).Error }) }
接下来只要要按照文件里边的放开注释代码即可。
// TODO: 例如 新增表结构 使用过程中请删除此段代码 err = tx.Migrator().AutoMigrate( new(models.TbDemo), ) if err != nil { return err }
-
执行迁移
温馨提醒,请认真阅读
数据库操作建议做好检查确认脚本,另外确认完成cmd/migrate/migration/version
目录中是否只有新建的文件没有被执行过,因为执行迁移指令的过程中,系统会检查没有执行过的迁移脚本,将为执行的脚本全部执行;# 注意:默认使用config/settings.yml配置文件 $ ./go-admin migrate # 或者 可以指定配置文件 $ ./go-admin migrate -c config/settings.dev.yml
执行成功后检查数据库的对应信息,和预期一样就迁移成功了。
更新模型
我们先下载go-admin ,并以修改字段名称为例:
-
生成迁移文件
首先执行,
$ ./go-admin migrate -a true -g true generate migration file
完成后,我们打开
cmd/migrate/migration/version
目录,这时里边已经为您新添加了一个迁移文件(一般会在最下边),我们打开看一下:package version import ( "gorm.io/gorm" "runtime" "go-admin/cmd/migrate/migration" common "go-admin/common/models" ) func init() { _, fileName, _, _ := runtime.Caller(0) migration.Migrate.SetVersion(migration.GetFilename(fileName), _1654233005296Test) } func _1654233005296Test(db *gorm.DB, version string) error { return db.Transaction(func(tx *gorm.DB) error { // TODO: 这里开始写入要变更的内容 // TODO: 例如 修改表字段 使用过程中请删除此段代码 //err := tx.Migrator().RenameColumn(&models.SysConfig{}, "config_id", "id") //if err != nil { // return err //} // TODO: 例如 新增表结构 使用过程中请删除此段代码 //err = tx.Migrator().AutoMigrate( // new(models.CasbinRule), // ) //if err != nil { // return err //} return tx.Create(&common.Migration{ Version: version, }).Error }) }
-
修改迁移脚本
接下来只要要按照文件里边的放开注释代码即可。// TODO: 例如 新增表结构 使用过程中请删除此段代码 err := tx.Migrator().RenameColumn(&models.TbDemo{}, "name", "name_new") if err != nil { return err }
-
执行迁移
温馨提醒,请认真阅读
数据库操作建议做好检查确认脚本,另外确认完成cmd/migrate/migration/version
目录中是否只有新建的文件没有被执行过,因为执行迁移指令的过程中,系统会检查没有执行过的迁移脚本,将为执行的脚本全部执行;# 注意:默认使用config/settings.yml配置文件 $ ./go-admin migrate # 或者 可以指定配置文件 $ ./go-admin migrate -c config/settings.dev.yml
执行成功后检查数据库的对应信息,和预期一样就迁移成功了。
文章出自doc-admin.dev,更多详细内容可以进入doc-admin.dev查看。