【问题标题】:Cannot make Goose DB Migration working for Go testing无法使 Goose DB 迁移适用于 Go 测试
【发布时间】:2018-01-06 02:24:03
【问题描述】:

我目前正在学习 Golang 进行 Web 编程,现在我继续学习数据库、Rest API 和 Golang 测试。

现在我遇到了 Goose 数据库迁移和 Go 测试 集成的问题。

我想将 goose 迁移集成到我的 Go 测试代码中,我的方案是在测试之前启动所有迁移,然后在测试完成后重置所有数据库。

我的问题是我找不到任何文档/示例代码来使用Goose

我也尝试过使用 exec.Command() 执行 goose 命令,但它总是返回 exit status 1

这是我现有的代码,用于在执行测试之前触发向上迁移:

func pretest() {
      var args = []string{
          os.Getenv("DB_SERVER"),
          "\"user=" + os.Getenv("DB_USERNAME") + " dbname=" + os.Getenv("DB_TEST_NAME") + " sslmode=disable\"",
          "up",
      }   

      exe := exec.Command("goose", args...)
      exe.Dir = os.Getenv("DB_MIGRATION")
      /* result, err := exe.Output()*/
      //fmt.Println(string(result))
      /*fmt.Println(err)*/

      output := exe.Run()
      fmt.Println(output)
  }

$ go test -v
exit status 1
testing: warning: no tests to run
PASS
ok

我的问题是可以从 Go 代码(在这种情况下是测试代码)内部触发迁移(向上/向下/重置)吗?

为什么 exec.Command() 一直返回 code status 1 但是当我执行另一个 linux 命令时它运行良好(ls、pwd、mkdir 在相同的情况下运行良好方式)?

【问题讨论】:

  • 请勿发布文字图片。它们不可搜索,甚至无法读取。请复制并粘贴所有文本内容。
  • 解决您的问题:is it possible to trigger migration (up/down/reset) from inside Go Code? 您可以为所欲为。你试过什么?你遇到了什么问题?
  • @Flimzy 就像我之前说的那样,我需要在测试运行之前迁移所有迁移,然后在测试完成后迁移重置。
  • 你没有回答我的问题。你试过什么?你遇到了什么问题?
  • 我正在尝试测试我的 Rest API 代码,这需要在测试运行之前准备好我的数据库表。我的问题是我无法在单元测试之前设置 goose 迁移来迁移所有表

标签: database testing go database-migration


【解决方案1】:

我也是go 的新手,所以我的分析可能完全错误,但由于goose 本身似乎是一个开源包,我查看了cmd/goose/main.go 文件,该文件指的是命令如何在内部调用:

if err := goose.Run(command, db, *dir, arguments...); err != nil {
    log.Fatalf("goose run: %v", err)
}

调用goose.go中定义的Runfunc

func Run(command string, db *sql.DB, dir string, args ...string) error {

这需要参数 command 字符串参数以及 db 字符串。

但是,如果您仍想使用execCommand,那么也许您可以查看goose_test.go 文件,该文件传递参数dir,可能会在其中运行迁移。

【讨论】:

    【解决方案2】:

    最后我通过在我的代码中更改以下行来解决这个问题:

    "\"user=" + os.Getenv("DB_USERNAME") + " dbname=" + os.Getenv("DB_TEST_NAME") + " sslmode=disable\"",
    

    到:

    "user=" + os.Getenv("DB_USERNAME") + " dbname=" + os.Getenv("DB_TEST_NAME") + " sslmode=disable",
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 2020-06-01
      相关资源
      最近更新 更多