فهرست منبع

feat(Command): seed 命令

runningwater 6 ماه پیش
والد
کامیت
ffb822ae91
3فایلهای تغییر یافته به همراه91 افزوده شده و 4 حذف شده
  1. 37 0
      app/cmd/seed.go
  2. 1 0
      main.go
  3. 53 4
      pkg/seed/seeder.go

+ 37 - 0
app/cmd/seed.go

@@ -0,0 +1,37 @@
+// Author: simon (ynwdlxm@163.com)
+// Date: 2025/7/16 11:24
+// Desc: seed 命令
+
+package cmd
+
+import (
+	"github.com/spf13/cobra"
+
+	"github.com/runningwater/gohub/database/seeders"
+	"github.com/runningwater/gohub/pkg/console"
+	"github.com/runningwater/gohub/pkg/seed"
+)
+
+var CmdDBSeed = &cobra.Command{
+	Use:   "seed",
+	Short: "Insert fake data to the database",
+	Run:   runSeeders,
+	Args:  cobra.MaximumNArgs(1), // 只允许一个参数
+}
+
+func runSeeders(cmd *cobra.Command, args []string) {
+	seeders.Initialize()
+	if len(args) > 0 {
+		name := args[0]
+		seeder := seed.GetSeeder(name)
+		if len(seeder.Name) > 0 {
+			seed.RunSeeder(name)
+		} else {
+			console.Error("Seeder not found: " + name)
+		}
+	} else {
+		// 默认运行全部迁移
+		seed.RunAll()
+		console.Success("Done seeding.")
+	}
+}

+ 1 - 0
main.go

@@ -50,6 +50,7 @@ func main() {
 		cmd.CmdKey,
 		cmd.CmdPlay,
 		cmd.CmdMigrate,
+		cmd.CmdDBSeed,
 		// cmd.CmdTestCommand,
 
 		make.CmdMake,

+ 53 - 4
pkg/seed/seeder.go

@@ -1,10 +1,15 @@
 // Package seed 存放数据库填充数据
 package seed
 
-import "gorm.io/gorm"
+import (
+	"gorm.io/gorm"
+
+	"github.com/runningwater/gohub/pkg/console"
+	"github.com/runningwater/gohub/pkg/database"
+)
 
 // 存放所有 Seeder
-var seedrs []Seeder
+var seeders []Seeder
 
 // 按排序执行的 Seeder 数组
 var orderedSeederNames []string
@@ -17,9 +22,9 @@ type Seeder struct {
 	Func SeederFunc
 }
 
-// AddSeeder 添加一个 Seeder
+// Add AddSeeder 添加一个 Seeder
 func Add(name string, fn SeederFunc) {
-	seedrs = append(seedrs, Seeder{
+	seeders = append(seeders, Seeder{
 		Name: name,
 		Func: fn,
 	})
@@ -29,3 +34,47 @@ func Add(name string, fn SeederFunc) {
 func SetRunOrder(names []string) {
 	orderedSeederNames = names
 }
+
+// GetSeeder 获取 Seeder
+func GetSeeder(name string) Seeder {
+	for _, seeder := range seeders {
+		if seeder.Name == name {
+			return seeder
+		}
+	}
+	return Seeder{}
+}
+
+// RunAll 执行所有 Seeder
+func RunAll() {
+	// 先运行 ordered 的
+	executed := make(map[string]string)
+	for _, name := range orderedSeederNames {
+		seeder := GetSeeder(name)
+		if len(seeder.Name) > 0 {
+			if seeder.Func != nil {
+				seeder.Func(database.DB)
+				executed[name] = name
+			}
+		}
+	}
+
+	// 再运行剩下的
+	for _, seeder := range seeders {
+		if _, ok := executed[seeder.Name]; !ok {
+			if seeder.Func != nil {
+				console.Warning("Running Seeder: " + seeder.Name)
+				seeder.Func(database.DB)
+			}
+		}
+	}
+}
+
+// RunSeeder 运行指定的 Seeder
+func RunSeeder(name string) {
+	seeder := GetSeeder(name)
+	if seeder.Func != nil {
+		console.Warning("Running Seeder: " + seeder.Name)
+		seeder.Func(database.DB)
+	}
+}