Skip to content

Commit

Permalink
build(seeds): add a seeds package with the necessary logic to seed th…
Browse files Browse the repository at this point in the history
…e database
  • Loading branch information
danvergara committed May 1, 2021
1 parent 4f259ba commit a5376fb
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 0 deletions.
34 changes: 34 additions & 0 deletions cmd/seeder/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package main

import (
"flag"
"log"
"os"

"github.com/danvergara/dblab/db/seeds"
"github.com/danvergara/dblab/pkg/config"
"github.com/jmoiron/sqlx"
)

func main() {
handleArgs()
}

func handleArgs() {
flag.Parse()
args := flag.Args()
cfg := config.Get()

if len(args) >= 1 {
switch args[0] {
case "seed":
connString := cfg.GetDBConnStr()
db, err := sqlx.Open(cfg.Driver(), connString)
if err != nil {
log.Fatalf("Error opening DB: %v", err)
}
seeds.Execute(db, args[1:]...)
os.Exit(0)
}
}
}
53 changes: 53 additions & 0 deletions db/seeds/seeder.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package seeds

import (
"log"
"reflect"

"github.com/jmoiron/sqlx"
)

// Seed type.
type Seed struct {
db *sqlx.DB
}

// Execute will executes the given seeder method.
func Execute(db *sqlx.DB, seedMethodNames ...string) {
s := Seed{
db: db,
}

seedType := reflect.TypeOf(s)

// Executes all seeders if no method is given.
if len(seedMethodNames) == 0 {
log.Println("running all seeder...")
// We are looping over the method on a Seed struct.
for i := 0; i < seedType.NumMethod(); i++ {
// Get the method in the current iteration.
method := seedType.Method(i)
// Execute seeder.
seed(s, method.Name)
}
}

// Execute only the given method names
for _, item := range seedMethodNames {
seed(s, item)
}
}

func seed(s Seed, seedMethodName string) {
// Get the reflect value of the method.
m := reflect.ValueOf(s).MethodByName(seedMethodName)
// Exit if the method diesn't exist.
if !m.IsValid() {
log.Fatal("no method called", seedMethodName)
}

// Execute the method.
log.Println("seeding", seedMethodName, "...")
m.Call(nil)
log.Println("seed", seedMethodName, "succeded")
}

0 comments on commit a5376fb

Please sign in to comment.