首頁  >  文章  >  後端開發  >  如何使用 TOML 裝置在使用 Go Buffalo 框架的開發環境中為我的資料庫播種?

如何使用 TOML 裝置在使用 Go Buffalo 框架的開發環境中為我的資料庫播種?

王林
王林轉載
2024-02-11 13:33:08531瀏覽

如何使用 TOML 装置在使用 Go Buffalo 框架的开发环境中为我的数据库播种?

在使用Go Buffalo框架進行開發時,我們經常需要為資料庫進行播種,以便在測試和開發環境中填充一些初始資料。 TOML是一種簡單易讀的設定檔格式,它可以用來定義資料。那麼如何使用TOML檔案來為我們的資料庫播種呢?在本文中,php小編小新將向您介紹一種簡單的方法來在Go Buffalo框架的開發環境中使用TOML裝置為資料庫播種。讓我們一起來看看吧!

問題內容

我正在嘗試使用 TOML 固定裝置在 Go Buffalo 框架中植入我的開發資料庫。但是,我無法找到有關如何執行此操作的清晰範例或文件。

解決方法

要為資料庫新增種子,您可以使用 grifts。建立新應用程式時,應該在 grifts/db.go 處產生一個虛擬佔位符 grift,如下所示:

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
    })

})

我嘗試在 grift 中使用 model.loadfixture("seed widgets") ,但有一些恐慌,因為它不在測試環境中。我認為不直接支援從 toml 裝置進行資料庫播種,但這將是一個有用的功能。然而,查看 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
    })

})

以上是如何使用 TOML 裝置在使用 Go Buffalo 框架的開發環境中為我的資料庫播種?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除