seeder.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // Package seed 存放数据库填充数据
  2. package seed
  3. import (
  4. "gorm.io/gorm"
  5. "github.com/runningwater/gohub/pkg/console"
  6. "github.com/runningwater/gohub/pkg/database"
  7. )
  8. // 存放所有 Seeder
  9. var seeders []Seeder
  10. // 按排序执行的 Seeder 数组
  11. var orderedSeederNames []string
  12. type SeederFunc func(*gorm.DB)
  13. // Seeder 对应每一个 database/seeders 目录下的 Seeder 文件
  14. type Seeder struct {
  15. Name string
  16. Func SeederFunc
  17. }
  18. // Add AddSeeder 添加一个 Seeder
  19. func Add(name string, fn SeederFunc) {
  20. seeders = append(seeders, Seeder{
  21. Name: name,
  22. Func: fn,
  23. })
  24. }
  25. // SetRunOrder 设置 按顺序执行的 Seeder 数组
  26. func SetRunOrder(names []string) {
  27. orderedSeederNames = names
  28. }
  29. // GetSeeder 获取 Seeder
  30. func GetSeeder(name string) Seeder {
  31. for _, seeder := range seeders {
  32. if seeder.Name == name {
  33. return seeder
  34. }
  35. }
  36. return Seeder{}
  37. }
  38. // RunAll 执行所有 Seeder
  39. func RunAll() {
  40. // 先运行 ordered 的
  41. executed := make(map[string]string)
  42. for _, name := range orderedSeederNames {
  43. seeder := GetSeeder(name)
  44. if len(seeder.Name) > 0 {
  45. if seeder.Func != nil {
  46. seeder.Func(database.DB)
  47. executed[name] = name
  48. }
  49. }
  50. }
  51. // 再运行剩下的
  52. for _, seeder := range seeders {
  53. if _, ok := executed[seeder.Name]; !ok {
  54. if seeder.Func != nil {
  55. console.Warning("Running Seeder: " + seeder.Name)
  56. seeder.Func(database.DB)
  57. }
  58. }
  59. }
  60. }
  61. // RunSeeder 运行指定的 Seeder
  62. func RunSeeder(name string) {
  63. seeder := GetSeeder(name)
  64. if seeder.Func != nil {
  65. console.Warning("Running Seeder: " + seeder.Name)
  66. seeder.Func(database.DB)
  67. }
  68. }