Go通过gormigrate管理数据库迁移

Go通过gormigrate管理数据库迁移

       最近整理了之前写的Go项目,对于数据库管理这一块也想Laravel那样通过迁移文件来进行数据库结构的管理,通过网上查找资料跟实践,发现gormigrate项目适合自己,并且对于Gorm非常兼容,因为我使用的数据库包基本都是gorm,所以决定使用gormigrate来对项目的数据库进行管理,下面跟大家分享我是如何通过gormigrate进行数据库管理。

       一、创建迁移文件目录

       我们在项目根目录下创建一个database目录,在该目录下我们创建migrations用于存放数据库迁移文件,然后我们在migrations目录下创建一个Task.go文件,用于执行迁移,目录结构如下

微信截图_20220708085452.png

数据库迁移文件我基本都是以时间+操作为名称。

       二、创建迁移文件

       我们创建类似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

我们看看数据库结构

微信截图_20220708090420.png

admin_user表成功创建。

       下面是我参考的两份文档,大家有兴趣可以看看gormigrategorm

0条评论

发表评论