Skip to Content

Seeds

The seeds package provides a database seeding system for populating initial or test data using GORM. It uses a simple registry pattern where seed functions are registered and then executed in order.

Import

import "github.com/gofastadev/gofasta/pkg/seeds"

Key Functions

FunctionSignatureDescription
Registerfunc Register(fn func(*gorm.DB) error)Registers a seed function to the global registry
RunAllfunc RunAll(db *gorm.DB) errorExecutes all registered seed functions in order

Usage

Registering Seeds

Seed functions take a *gorm.DB and return an error. Register them using seeds.Register:

func init() { seeds.Register(func(db *gorm.DB) error { roles := []Role{ {Name: "admin", Description: "Administrator"}, {Name: "editor", Description: "Content Editor"}, {Name: "viewer", Description: "Read-only Viewer"}, } for _, role := range roles { if err := db.FirstOrCreate(&role, Role{Name: role.Name}).Error; err != nil { return err } } return nil }) seeds.Register(func(db *gorm.DB) error { admin := User{ Name: "Admin", Email: "admin@example.com", Password: hashedPassword, Role: "admin", } return db.FirstOrCreate(&admin, User{Email: admin.Email}).Error }) }

Running Seeds

if err := seeds.RunAll(db); err != nil { log.Fatalf("seeding failed: %v", err) }

Seed Ordering

Seeds run in the order they are registered. To control execution order, register them in the desired sequence — typically using init() functions with careful package import ordering, or by calling Register explicitly in your setup code:

func registerSeeds() { seeds.Register(seedRoles) // runs first seeds.Register(seedAdminUser) // runs second seeds.Register(seedCategories) // runs third }

Idempotent Seeds

Use GORM’s FirstOrCreate to make seeds idempotent:

seeds.Register(func(db *gorm.DB) error { categories := []Category{ {Name: "Technology"}, {Name: "Science"}, {Name: "Art"}, } for _, cat := range categories { if err := db.FirstOrCreate(&cat, Category{Name: cat.Name}).Error; err != nil { return err } } return nil })

Integration with Application Startup

func main() { cfg, _ := config.LoadConfig() db, _ := setupDatabase(cfg.Database) registerSeeds() if err := seeds.RunAll(db); err != nil { log.Fatalf("seeding failed: %v", err) } // Start server... }
  • Config — Database setup used by the seeder
  • Models — Models being seeded
  • Encryption — Encrypt sensitive seed data
Last updated on