diff options
| author | Alexander Kavon <me+git@alexkavon.com> | 2024-01-23 06:33:41 -0500 |
|---|---|---|
| committer | Alexander Kavon <me+git@alexkavon.com> | 2024-01-23 06:33:41 -0500 |
| commit | b03f12507c1c53b3599bece3ded0ad39753e65fd (patch) | |
| tree | 68a4d7ef52b7920d204462d2a82dae5020813250 /seed | |
| parent | 8d92bdf7da95e1085485c0e60b9dac19c246e235 (diff) | |
seed package to seed database on the fly
Diffstat (limited to 'seed')
| -rw-r--r-- | seed/main.go | 35 | ||||
| -rw-r--r-- | seed/seeder/seeder.go | 47 | ||||
| -rw-r--r-- | seed/seeder/tern.go | 28 |
3 files changed, 110 insertions, 0 deletions
diff --git a/seed/main.go b/seed/main.go new file mode 100644 index 0000000..a2cc084 --- /dev/null +++ b/seed/main.go @@ -0,0 +1,35 @@ +package main + +import ( + "log" + "os" + "path/filepath" + + "gitlab.com/alexkavon/newsstand/seed/seeder" + "gitlab.com/alexkavon/newsstand/src/conf" + "gitlab.com/alexkavon/newsstand/src/db" +) + +func main() { + err := os.Setenv("NEWSSTAND_CONFIG_PATH", "./.seedrc.toml") + if err != nil { + log.Fatal(err) + } + config := conf.NewConf() + database := db.NewDb(config) + defer database.Close() + // load seeder + s := seeder.NewSeeder(database) + // migrate + migrations := filepath.Join(config.GetCwd(), "/migrations") + err = seeder.MigrateDatabase(database, migrations) + if err != nil { + log.Fatal(err) + } + + err = s.SeedUsers(10) + if err != nil { + log.Fatal(err) + } + os.Exit(0) +} diff --git a/seed/seeder/seeder.go b/seed/seeder/seeder.go new file mode 100644 index 0000000..37dfe30 --- /dev/null +++ b/seed/seeder/seeder.go @@ -0,0 +1,47 @@ +package seeder + +import ( + "context" + "log" + + "github.com/go-faker/faker/v4" + "github.com/go-faker/faker/v4/pkg/options" + "github.com/volatiletech/sqlboiler/v4/boil" + "gitlab.com/alexkavon/newsstand/src/db" + "gitlab.com/alexkavon/newsstand/src/models" + "gitlab.com/alexkavon/newsstand/src/user" +) + +type Seeder struct { + dbconn *db.Db +} + +func beginSeed(dbconn *db.Db, insertFunc func(context.Context, boil.ContextExecutor, boil.Columns) error) error { + return insertFunc(context.Background(), dbconn.ToSqlDb(), boil.Infer()) +} + +func NewSeeder(dbconn *db.Db) *Seeder { + options.SetGenerateUniqueValues(true) + return &Seeder{dbconn} +} + +func (s *Seeder) SeedUsers(num int) error { + user.InitHooks() + for i := 1; i <= num; i++ { + log.Printf("seeding=%d", i) + u := &models.User{} + u.Username = faker.Username() + u.Secret = faker.Password() + + err := beginSeed(s.dbconn, u.Insert) + if err != nil { + return err + } + } + return nil +} + +func (s *Seeder) SeedPosts(num int) error { + // query users, pick random, generate num posts + return nil +} diff --git a/seed/seeder/tern.go b/seed/seeder/tern.go new file mode 100644 index 0000000..8eff9d5 --- /dev/null +++ b/seed/seeder/tern.go @@ -0,0 +1,28 @@ +package seeder + +import ( + "context" + "os" + + "github.com/jackc/tern/v2/migrate" + "gitlab.com/alexkavon/newsstand/src/db" +) + +func MigrateDatabase(dbpool *db.Db, migrationspath string) error { + conn, err := dbpool.Conn().Acquire(context.Background()) + if err != nil { + return err + } + m, err := migrate.NewMigrator(context.Background(), conn.Conn(), "public.schema_version") + if err != nil { + return err + } + // load migration files + err = m.LoadMigrations(os.DirFS(migrationspath)) + if err != nil { + return err + } + + // migrate! + return m.Migrate(context.Background()) +} |
