我正在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
    })

})

Go相关问答推荐

无法找到与golang、nginx和postquist进行的docker-compose./主要

如何解析Go-Gin多部分请求中的 struct 切片

如何根据中间件的请求设置上下文值?获取 go-staticcheck 问题

如何测试 Zerolog 记录器引发类型错误的日志(log)事件?

当我使用 CircleCI 构建 Go Image 时,我得到runtime/cgo: pthread_create failed: Operation not allowed

用 fork 替换 Go 依赖:...用于两个不同的模块路径

使用GOTK3和librsvg在Go中如何加载内联SVG?

Go 中的 Azure JWT 验证不起作用

golang yaml 马歇尔网址

如何使用名称具有包名称的嵌套 struct 启动 go struct

go version -m 输出中的箭头符号=>是什么意思?

如何将元素从一个切片移动到另一个切片

获取不带类型参数的泛型 struct 的类型名称

使用 golang 生成 vim

golang pic.ShowImage 为什么它不生成图像而是向我发送base64值

go:识别重新定义标志的包

Golang prometheus 显示自定义指标

Golang - 使用正则表达式提取链接

无法识别同步错误.使用一次

Golang 中的无实体函数