我正在try 使用TOML装备在Go Buffalo框架中 seeder 我的开发数据库.然而,我很难找到一个明确的例子或文档来说明如何做到这一点.
我正在try 使用TOML装备在Go Buffalo框架中 seeder 我的开发数据库.然而,我很难找到一个明确的例子或文档来说明如何做到这一点.
要在数据库中设置种子,您可以使用欺诈.在创建新应用程序时,应该有一个以grifts/db.go
为单位生成的虚拟占位符欺诈,如下所示:
package grifts
import "github.com/gobuffalo/grift/grift"
var _ = grift.Namespace("db", func() {
grift.Desc("seed", "Seeds a database")
grift.Add("seed", func(c *grift.Context) error {
// Add DB seeding stuff here
return nil
})
})
我试图在诈骗中使用model.LoadFixture("seed widgets")
,但有一些panic ,因为它不是在测试环境中.我认为不直接支持从Toml装置中进行DB种子设定,但这将是一个有用的特性.然而,查看来自LoadFixture的代码,我们可以构建我们自己的装置加载:
假设您有一个具有名为name = "seed widgets"
的场景的灯具:
package grifts
import (
"fmt"
"os"
"strings"
"github.com/gobuffalo/grift/grift"
"github.com/gobuffalo/suite/v4"
"github.com/gobuffalo/suite/v4/fix"
)
var _ = grift.Namespace("db", func() {
grift.Desc("seed", "Seeds a database")
grift.Add("seed", func(c *grift.Context) error {
// The DB connection will connect to the environment set in `GO_ENV` (defaults to `test`)
// Set this environment variable in your `.env` file to `development`
// NOTE: it may be better to put seed fixtures in a different directory
// to seperate concerns
model, err := suite.NewModelWithFixtures(os.DirFS("./fixtures"))
if err != nil {
return err
}
sc, err := fix.Find("seed widgets")
if err != nil {
return err
}
for _, table := range sc.Tables {
for _, row := range table.Row {
q := "insert into " + table.Name
keys := []string{}
skeys := []string{}
for k := range row {
keys = append(keys, k)
skeys = append(skeys, ":"+k)
}
q = q + fmt.Sprintf(" (%s) values (%s)", strings.Join(keys, ","), strings.Join(skeys, ","))
if _, err = model.DB.Store.NamedExec(q, row); err != nil {
return err
}
}
}
return nil
})
})