Seeders
Seeders populate your database with initial or test data. Nimbus provides the database.Seeder interface and a SeedRunner to execute seeders in order.
The Seeder interface
Any type that implements Run(db *gorm.DB) error is a valid seeder:
type Seeder interface {
Run(db *gorm.DB) error
}
Creating a seeder
Generate a seeder scaffold with the CLI:
nimbus make:seeder user_seeder
This creates a file in database/seeders/. Implement the Run method with your seed logic:
type UserSeeder struct{}
func (s *UserSeeder) Run(db *gorm.DB) error {
users := []User{
{Name: "Alice", Email: "alice@example.com", Role: "admin"},
{Name: "Bob", Email: "bob@example.com", Role: "user"},
{Name: "Charlie", Email: "charlie@example.com", Role: "user"},
}
return db.Create(&users).Error
}
Using SeedFunc
For simple seeders you can use database.SeedFunc to adapt a plain function without defining a struct:
tagSeeder := database.SeedFunc(func(db *gorm.DB) error {
tags := []Tag{
{Name: "go"}, {Name: "web"}, {Name: "nimbus"},
}
return db.Create(&tags).Error
})
Running seeders
Run all seeders from database/seeders/registry.go with:
nimbus db:seed
Or use database.NewSeedRunner programmatically:
runner := database.NewSeedRunner(db, []database.Seeder{
&UserSeeder{},
&PostSeeder{},
tagSeeder,
})
if err := runner.Run(); err != nil {
log.Fatalf("seeding failed: %v", err)
}
Seeding relationships
When seeding related records, order your seeders so parent records are created first. Use GORM associations or create records with explicit foreign keys:
type PostSeeder struct{}
func (s *PostSeeder) Run(db *gorm.DB) error {
var admin User
db.Where("role = ?", "admin").First(&admin)
posts := []Post{
{Title: "Welcome to Nimbus", Body: "Getting started guide", UserID: admin.ID},
{Title: "Building APIs", Body: "REST API tutorial", UserID: admin.ID},
}
return db.Create(&posts).Error
}
Using faker data
For realistic test data, use a library like github.com/brianvoe/gofakeit inside your seeders:
func (s *UserSeeder) Run(db *gorm.DB) error {
for i := 0; i < 50; i++ {
user := User{
Name: gofakeit.Name(),
Email: gofakeit.Email(),
Role: "user",
}
if err := db.Create(&user).Error; err != nil {
return err
}
}
return nil
}