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
| Function | Signature | Description |
|---|---|---|
Register | func Register(fn func(*gorm.DB) error) | Registers a seed function to the global registry |
RunAll | func RunAll(db *gorm.DB) error | Executes 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...
}Related Pages
- Config — Database setup used by the seeder
- Models — Models being seeded
- Encryption — Encrypt sensitive seed data
Last updated on