Implementing Database Seeder in Go

Defining the Seeder Interface⌗
package models
type (
Seeder interface {
Seed() error
}
Model interface {
Store() error
Update(id string) error
}
)
Defining the Model⌗
type Menu struct {
Code string `xorm:"not null pk comment('编码') VARCHAR(255)"`
ParentCode string `xorm:"not null comment('父编码') index VARCHAR(255)"`
PermissionCode string `xorm:"not null comment('权限编码') index VARCHAR(255)"`
Name string `xorm:"not null comment('名称') VARCHAR(255)"`
Route string `xorm:"not null comment('前端路由') VARCHAR(255)"`
Icon string `xorm:"not null comment('图标') VARCHAR(255)"`
}
// Define the model's table name
func (menu *Menu) TableName() string {
return "menus"
}
// Data seeder
func (menu *Menu) Seed() error {
return menu.Store()
}
// Create menu
func (menu *Menu) Store() error {
_, err := Engine.Insert(menu)
return err
}
Defining the Seeder Registration Interface and Seeder Structure⌗
package seeds
import (
"github.com/betterde/ects/models"
"log"
)
type (
SeederInterface interface {
Register(seeder *Seeder)
}
Seeder struct {
instances []models.Seeder
}
)
func (seeder *Seeder) Run() error {
seeders := []SeederInterface{
&MenuSeeder{},
&PermissionSeeder{},
}
for _, item := range seeders {
item.Register(seeder)
}
for _, instalce := range seeder.instances {
if err := instalce.Seed(); err != nil {
log.Println(err)
}
}
return nil
}
Implementing the Model’s Seeding Method⌗
Implementing the Register
method for the menu model,
package seeds
import "github.com/betterde/ects/models"
type (
MenuSeeder struct {
}
)
func (menus *MenuSeeder) Register(seeder *Seeder) {
items := []models.Seeder{
&models.Menu{
Code: "dashboard",
ParentCode: "",
PermissionCode: "dashboard",
Name: "Overview",
Route: "/dashboard",
Icon: "",
},
&models.Menu{
Code: "task",
ParentCode: "",
PermissionCode: "task",
Name: "Tasks",
Route: "/task",
Icon: "",
},
&models.Menu{
Code: "worker",
ParentCode: "",
PermissionCode: "worker",
Name: "Nodes",
Route: "/worker",
Icon: "",
},
&models.Menu{
Code: "team",
ParentCode: "",
PermissionCode: "team",
Name: "Team",
Route: "/team",
Icon: "",
},
&models.Menu{
Code: "user",
ParentCode: "",
PermissionCode: "user",
Name: "Users",
Route: "/user",
Icon: "",
},
&models.Menu{
Code: "log",
ParentCode: "",
PermissionCode: "log",
Name: "Logs",
Route: "/log",
Icon: "",
},
&models.Menu{
Code: "record",
ParentCode: "",
PermissionCode: "record",
Name: "Records",
Route: "/record",
Icon: "",
},
&models.Menu{
Code: "setting",
ParentCode: "",
PermissionCode: "setting",
Name: "Settings",
Route: "/setting",
Icon: "",
},
}
seeder.instances = append(seeder.instances, items...)
}
Calling at Service Startup⌗
seedService := seeds.Seeder{}
if err := seedService.Run(); err != nil {
return response.InternalServerError("Failed to seed system data", err)
}
I hope this is helpful, Happy hacking…