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条评论