我目前正在学习用于Web编程的Golang,现在我继续学习有关数据库,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)
  }

database - 无法使Goose DB Migration适用于Go测试-LMLPHP
$ go test -v
exit status 1
testing: warning: no tests to run
PASS
ok

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

为什么 exec.Command()保持返回代码状态1,但是当我执行另一个linux命令(ls,pwd,mkdir以相同的方式很好地工作)时,它工作良好?

最佳答案

我也是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 Run(command string, db *sql.DB, dir string, args ...string) error {

这也需要带有数据库字符串的参数command字符串参数。

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

关于database - 无法使Goose DB Migration适用于Go测试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45400203/

10-11 23:35