From f173d851c2676fdeb9c8e761b1249af70843f88d Mon Sep 17 00:00:00 2001 From: yanghao05 Date: Sun, 29 Jan 2023 17:56:51 +0800 Subject: [PATCH] add seeding demo --- cmd/seed.go | 52 +++++++++++++++++++++++++++++++++++ contracts/seeder.go | 10 +++++++ database/seeders/user.go | 59 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 cmd/seed.go create mode 100644 contracts/seeder.go create mode 100644 database/seeders/user.go diff --git a/cmd/seed.go b/cmd/seed.go new file mode 100644 index 0000000..02e4758 --- /dev/null +++ b/cmd/seed.go @@ -0,0 +1,52 @@ +/* +Copyright © 2023 NAME HERE +*/ +package cmd + +import ( + _ "atom/database/seeders" + _ "atom/providers" + + "atom/container" + "atom/contracts" + "log" + + "github.com/spf13/cobra" + "go.uber.org/dig" + "gorm.io/gorm" +) + +// seedCmd represents the seed command +var seedCmd = &cobra.Command{ + Use: "seed", + Short: "seed databases", + Long: `seed your database with data using seeders.`, + RunE: func(cmd *cobra.Command, args []string) error { + return container.Container.Invoke(func(seedersContainer SeedersContainer) error { + if len(seedersContainer.Seeders) == 0 { + log.Print("no seeder exists") + return nil + } + + for _, seeder := range seedersContainer.Seeders { + log.Printf("seed table (%s) for %d times", seeder.Table(), seeder.Times()) + seeder.Run(seedersContainer.DB) + } + return nil + }) + }, + PostRun: func(cmd *cobra.Command, args []string) { + log.Println("BINGO! seeding done") + }, +} + +func init() { + rootCmd.AddCommand(seedCmd) +} + +type SeedersContainer struct { + dig.In + + DB *gorm.DB + Seeders []contracts.Seeder `group:"seeders"` +} diff --git a/contracts/seeder.go b/contracts/seeder.go new file mode 100644 index 0000000..ef21d61 --- /dev/null +++ b/contracts/seeder.go @@ -0,0 +1,10 @@ +package contracts + +import "gorm.io/gorm" + +// Migration route interface +type Seeder interface { + Times() uint + Table() string + Run(*gorm.DB) +} diff --git a/database/seeders/user.go b/database/seeders/user.go new file mode 100644 index 0000000..7f787a6 --- /dev/null +++ b/database/seeders/user.go @@ -0,0 +1,59 @@ +package seeders + +import ( + "atom/container" + "atom/contracts" + "fmt" + "log" + "time" + + "go.uber.org/dig" + "gorm.io/gorm" +) + +func init() { + if err := container.Container.Provide(NewUserSeeder, dig.Group("seeders")); err != nil { + log.Fatal(err) + } +} + +type UserSeeder struct { +} + +func NewUserSeeder() contracts.Seeder { + return &UserSeeder{} +} + +type User struct { + gorm.Model + + Username string + Password string + Birthday time.Time + Status bool +} + +func (s *UserSeeder) Times() uint { + return 10 +} + +func (s *UserSeeder) Run(db *gorm.DB) { + var i uint + for i = 0; i < s.Times(); i++ { + data := s.Generate(i) + db.Table(s.Table()).Create(&data) + } +} + +func (s *UserSeeder) Table() string { + return "users" +} + +func (s *UserSeeder) Generate(idx uint) User { + return User{ + Username: fmt.Sprintf("username: %d", idx), + Password: fmt.Sprintf("password: %d", idx), + Birthday: time.Now().Add(time.Hour * 24 * time.Duration(idx)), + Status: idx%2 == 0, + } +}