Go通过gormigrate管理数据库迁移
Go通过gormigrate管理数据库迁移
最近整理了之前写的Go项目,对于数据库管理这一块也想Laravel那样通过迁移文件来进行数据库结构的管理,通过网上查找资料跟实践,发现gormigrate项目适合自己,并且对于Gorm非常兼容,因为我使用的数据库包基本都是gorm,所以决定使用gormigrate来对项目的数据库进行管理,下面跟大家分享我是如何通过gormigrate进行数据库管理。
一、创建迁移文件目录
我们在项目根目录下创建一个database目录,在该目录下我们创建migrations用于存放数据库迁移文件,然后我们在migrations目录下创建一个Task.go文件,用于执行迁移,目录结构如下
数据库迁移文件我基本都是以时间+操作为名称。
二、创建迁移文件
我们创建类似20220704160401_create_admin_user_table.go这样的文件,代码如下
package migrations //迁移内容-创建用户表 type CreateAdminUser struct { Id int `json:"id" gorm:"primary_key;AUTO_INCREMENT"` Nickname string `json:"nickname" gorm:"type:varchar(64);default:'';index:idx_username;uniqueIndex:idx_un_username;comment:昵称"` Username string `json:"username" gorm:"type:varchar(64);default:'';comment:用户名"` Password string `json:"password" gorm:"type:varchar(512);default:'';comment:密码"` Token string `json:"token" gorm:"type:varchar(64);default:'';comment:Token"` TokenOverAt int `json:"token_over_at" gorm:"type:int(11);default:0;comment:Token结束时间"` CreateAt int `json:"create_at" gorm:"type:int(11);default:0;comment:创建时间"` UpdateAt int `json:"update_at" gorm:"type:int(11);default:0;comment:更新时间"` } /** 映射指定表名 */ func (CreateAdminUser) TableName() string { return "admin_user" }
这个迁移文件就是创建一个admin_user表,并且强制指定表名为admin_user。
三、开发迁移执行
我们在migrations目录下创建的Task.go文件主要作为就是执行迁移,代码如下
package migrations //引入模块 import ( "github.com/go-gormigrate/gormigrate/v2" "github.com/astaxie/beego" "gorm.io/driver/mysql" "gorm.io/gorm" "log" ) //执行迁移 func MigrationsDataBase() { //获取数据库配置 mysqlUser := beego.AppConfig.String("mysqlUser") //账户 mysqlPass := beego.AppConfig.String("mysqlPass") //密码 mysqlDb := beego.AppConfig.String("mysqlDb") //数据库名 mysqlUrls := beego.AppConfig.String("mysqlUrls") //数据库地址 mysqlPort := beego.AppConfig.String("mysqlPort") //数据库端口 //初始化数据库链接 dsn := mysqlUser+":"+mysqlPass+"@tcp("+mysqlUrls+":"+mysqlPort+")/"+mysqlDb+"?charset=utf8mb4&parseTime=True&loc=Local" //链接数据库 db, err := gorm.Open(mysql.Open(dsn)) if err != nil { log.Println("失败") } //执行迁移过程 m := gormigrate.New(db, gormigrate.DefaultOptions, []*gormigrate.Migration{ //创建用户表 { ID: "20220704160401", Migrate: func(tx *gorm.DB) error { return tx.AutoMigrate(&CreateAdminUser{}) }, Rollback: func(tx *gorm.DB) error { return tx.Migrator().DropTable("admin_user") }, }, // }) //填充数据 fillData := gormigrate.New(db, gormigrate.DefaultOptions, []*gormigrate.Migration{ //填充默认数据 { ID: "20220705094101", Migrate: func(tx *gorm.DB) error { user := CreateAdminUser{Id:1, Nickname:"admin",Username:"admin",Password:"f6fdffe48c908deb0f4c3bd36c032e72",Token:"445e7ed9a7df555e5ae33b6e3a976566",TokenOverAt:1643202995,CreateAt:1642733669,UpdateAt:1643198795} db.Create(&user) return err }, Rollback: func(tx *gorm.DB) error { return err }, }, // }) //执行迁移 if err = m.Migrate(); err != nil { log.Println(err) } //执行填充 if err = fillData.Migrate(); err != nil { log.Println(err) } //打印结果 log.Printf("Migration did run successfully") }
我的项目是beego,数据库配置是放在配置文件中,读取方式是
mysqlUser := beego.AppConfig.String("mysqlUser") //账户 mysqlPass := beego.AppConfig.String("mysqlPass") //密码 mysqlDb := beego.AppConfig.String("mysqlDb") //数据库名 mysqlUrls := beego.AppConfig.String("mysqlUrls") //数据库地址 mysqlPort := beego.AppConfig.String("mysqlPort") //数据库端口
这里我们主要有两个执行过程,一种是管理表结构,下面我还多加了一层,填充初始化数据,这里我创建了用户表,同时创建了一个默认账户。
四、启动程序引入迁移操作
完成以上流程后,我们在项目的启动文件引入迁移操作,我的项目是beego,所以在main.go文件直接引入,代码如下
package main import ( _ "huaweiCloudScheduledTaskWeb/routers" "github.com/astaxie/beego" "huaweiCloudScheduledTaskWeb/utils" "github.com/astaxie/beego/toolbox" "huaweiCloudScheduledTaskWeb/database/migrations" ) func main() { // 定时任务 utils.InitTask() toolbox.StartTask() defer toolbox.StopTask() //数据库迁移 migrations.MigrationsDataBase() //启动程序 beego.Run() }
五、测试迁移效果
我们直接运行项目,看看执行迁移效果,输入以下命令
beego run
我们看看数据库结构
admin_user表成功创建。
下面是我参考的两份文档,大家有兴趣可以看看gormigrate、gorm。
0条评论