无法使Goose DB Migration适用于Go测试

时间:2017-07-30 13:14:56

标签: database testing go database-migration

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

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

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

我的问题是我无法使用Goose找到任何文档/示例代码。

我也尝试使用 exec.Command()执行goose命令,但它总是返回退出状态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)
  }

enter image description here

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

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

为什么 exec.Command()继续返回代码状态1 但是当我执行另一个linux命令时它运行良好(ls,pwd,mkdir在同一个版本中运行良好方式)?

2 个答案:

答案 0 :(得分: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

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

它也带有参数command字符串参数和db字符串。

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

答案 1 :(得分:0)

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

"\"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",