فهرست منبع

feat: migrate 包

runningwater 7 ماه پیش
والد
کامیت
0c2dea09d1
2فایلهای تغییر یافته به همراه74 افزوده شده و 0 حذف شده
  1. 31 0
      pkg/migrate/migration_file.go
  2. 43 0
      pkg/migrate/migrator.go

+ 31 - 0
pkg/migrate/migration_file.go

@@ -0,0 +1,31 @@
+package migrate
+
+import (
+	"database/sql"
+
+	"gorm.io/gorm"
+)
+
+// migrationFunc 定义一个函数类型,用于执行数据库迁移操作。
+type migrationFunc func(gorm.Migrator, *sql.DB)
+
+// migrationFiles 是一个切片,用于存储所有的迁移文件。
+var migrationFiles []MigrationFile
+
+// MigrationFile 定义一个结构体,用于存储迁移文件的信息。
+// 其中,Up 字段是一个函数类型,用于执行迁移操作;Down 字段是一个函数类型,用于回滚迁移操作;FileName 字段是迁移文件的名称。
+type MigrationFile struct {
+	Up       migrationFunc // Up 方法用于执行迁移操作
+	Down     migrationFunc // Down 方法用于回滚迁移操作
+	FileName string        // FileName 用于存储迁移文件的名称
+}
+
+// Add 新增一个迁移文件,所有的迁移文件都需要通过这个函数来注册。
+// up 和 down 分别是执行迁移和回滚操作的函数,fileName 是迁移文件的名称。
+func Add(up, down migrationFunc, fileName string) {
+	migrationFiles = append(migrationFiles, MigrationFile{
+		Up:       up,
+		Down:     down,
+		FileName: fileName,
+	})
+}

+ 43 - 0
pkg/migrate/migrator.go

@@ -0,0 +1,43 @@
+// Package: migrate 操作对象
+// 负责创建 migrations 数据表,以及执行迁移操作。
+package migrate
+
+import (
+	"github.com/runningwater/gohub/pkg/database"
+	"gorm.io/gorm"
+)
+
+// Migrator 结构体用于存储迁移器的相关信息。
+type Migrator struct {
+	Folder   string        // Folder 是存储迁移文件的目录名。
+	DB       *gorm.DB      // Db 是数据库连接对象。
+	Migrator gorm.Migrator // Migrator 是 GORM 的迁移器对象。
+}
+
+func (m *Migrator) createMigrationsTable() {
+	migration := Migration{}
+
+	if !m.Migrator.HasTable(&migration) {
+		// 如果表不存在,则创建表
+		m.Migrator.CreateTable(&migration)
+	}
+}
+
+// Migration 对应数据表 migrations 里的一条记录
+type Migration struct {
+	ID        uint64 `gorm:"primaryKey;autoIncrement;"`
+	Migration string `gorm:"type:varchar(255);not null;unique;"`
+	Batch     int
+}
+
+func NewMigrator() *Migrator {
+	migrator := &Migrator{
+		Folder:   "database/migrations",
+		DB:       database.DB,
+		Migrator: database.DB.Migrator(),
+	}
+
+	migrator.createMigrationsTable()
+
+	return migrator
+}