Parcourir la source

feat(command): make migration 命令

runningwater il y a 7 mois
Parent
commit
5914f1e4d8

+ 1 - 0
README.md

@@ -72,6 +72,7 @@ UNIQUE KEY `migration` (`migration`)
 
 #### 🚀 新功能
 
+- *(command)* Make migration 命令
 - *(command)* Migrate up 命令
 - *(middlewares)* Cors 中间件
 - Migrate 包

+ 1 - 0
app/cmd/make/make.go

@@ -71,6 +71,7 @@ func init() {
 		CmdMakeModel,
 		CmdMakeAPIController,
 		CmdMakeRequest,
+		CmdMakeMigration,
 	)
 }
 

+ 29 - 0
app/cmd/make/make_migration.go

@@ -0,0 +1,29 @@
+package make
+
+import (
+	"github.com/runningwater/gohub/pkg/app"
+	"github.com/runningwater/gohub/pkg/console"
+	"github.com/spf13/cobra"
+)
+
+var CmdMakeMigration = &cobra.Command{
+	Use:   "migration",
+	Short: "Create a migration file, example: make migration add_users_table",
+	Run:   runMakeMigration,
+	Args:  cobra.ExactArgs(1), // 只允许且必须传 1 个参数
+}
+
+func runMakeMigration(cmd *cobra.Command, args []string) {
+	// 格式:2023_01_30_141939_create_users_table.go
+	timeStr := app.TimenowInTimezone().Format("2006_01_02_150405")
+	// 第二个参数是迁移名称,用于生成迁移文件的文件名
+	model := makeModelFromString(args[0])
+	fileName := timeStr + "_" + model.PackageName
+	// 拼接生成的迁移文件的路径
+	filePath := "database/migrations/" + fileName + ".go"
+	// 基于 tpls 目录创建文件
+	createFileFromTpl(filePath, "migration", model, map[string]string{"{{FileName}}": fileName})
+
+	// 输出信息
+	console.Success("Migration file created, after modify it, use `migrate up` to migrate database.")
+}

+ 33 - 0
app/cmd/make/tpls/migration.tpl

@@ -0,0 +1,33 @@
+package migrations
+
+import (
+	"database/sql"
+	"gorm.io/gorm"
+
+	"github.com/runningwater/gohub/app/models"
+	"github.com/runningwater/gohub/pkg/migrate"
+)
+
+func init() {
+
+	type User struct {
+		models.BaseModel
+
+		Name     string `gorm:"type:varchar(255);not null;index"`
+		Email    string `gorm:"type:varchar(255);index;default:null"`
+		Phone    string `gorm:"type:varchar(20);index;default:null"`
+		Password string `gorm:"type:varchar(255)"`
+
+		models.CommonTimestampsField
+	}
+
+	up := func(migrator gorm.Migrator, DB *sql.DB) {
+		migrator.AutoMigrate(&User{})
+	}
+
+	down := func(migrator gorm.Migrator, DB *sql.DB) {
+		migrator.DropTable(&User{})
+	}
+
+	migrate.Add(up, down, "{{FileName}}")
+}

+ 14 - 13
app/cmd/migrate.go

@@ -5,33 +5,34 @@
 package cmd
 
 import (
-    "github.com/spf13/cobra"
+	"github.com/spf13/cobra"
 
-    "github.com/runningwater/gohub/database/migrations"
-    "github.com/runningwater/gohub/pkg/migrate"
+	"github.com/runningwater/gohub/database/migrations"
+	"github.com/runningwater/gohub/pkg/migrate"
 )
 
 var CmdMigrate = &cobra.Command{
-    Use:   "migrate",
-    Short: "Run database migrations",
+	Use:   "migrate",
+	Short: "Run database migrations",
 }
 var CmdMigrateUp = &cobra.Command{
-    Use:   "up",
-    Short: "Run up migrations",
-    Run:   runUp,
+	Use:   "up",
+	Short: "Run up migrations",
+	Run:   runUp,
 }
 
+// 初始化命令
 func init() {
-    CmdMigrate.AddCommand(CmdMigrateUp)
+	CmdMigrate.AddCommand(CmdMigrateUp)
 }
 
 func runUp(cmd *cobra.Command, args []string) {
-    migrator().Up()
+	migrator().Up()
 }
 
 func migrator() *migrate.Migrator {
-    // 注册 database/migrations 目录下的所有迁移文件
-    migrations.Initialize()
+	// 注册 database/migrations 目录下的所有迁移文件
+	migrations.Initialize()
 
-    return migrate.NewMigrator()
+	return migrate.NewMigrator()
 }

+ 1 - 2
bootstrap/database.go

@@ -5,7 +5,6 @@ import (
 	"fmt"
 	"time"
 
-	"github.com/runningwater/gohub/app/models/user"
 	"github.com/runningwater/gohub/pkg/config"
 	"github.com/runningwater/gohub/pkg/database"
 	"github.com/runningwater/gohub/pkg/logger"
@@ -48,5 +47,5 @@ func SetupDB() {
 	// 设置连接的最大存活时间
 	database.SQLDB.SetConnMaxLifetime(time.Duration(config.GetInt("database.mysql.max_life_seconds")) * time.Second)
 
-	_ = database.DB.AutoMigrate(&user.User{})
+	// _ = database.DB.AutoMigrate(&user.User{})
 }

+ 33 - 0
database/migrations/2025_06_03_101326_add_users_table.go

@@ -0,0 +1,33 @@
+package migrations
+
+import (
+	"database/sql"
+	"gorm.io/gorm"
+
+	"github.com/runningwater/gohub/app/models"
+	"github.com/runningwater/gohub/pkg/migrate"
+)
+
+func init() {
+
+	type User struct {
+		models.BaseModel
+
+		Name     string `gorm:"type:varchar(255);not null;index"`
+		Email    string `gorm:"type:varchar(255);index;default:null"`
+		Phone    string `gorm:"type:varchar(20);index;default:null"`
+		Password string `gorm:"type:varchar(255)"`
+
+		models.CommonTimestampsField
+	}
+
+	up := func(migrator gorm.Migrator, DB *sql.DB) {
+		migrator.AutoMigrate(&User{})
+	}
+
+	down := func(migrator gorm.Migrator, DB *sql.DB) {
+		migrator.DropTable(&User{})
+	}
+
+	migrate.Add(up, down, "2025_06_03_101326_add_users_table")
+}