database - 无法使 Goose DB Migration 用于 Go 测试

标签 database testing go database-migration

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

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

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

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

我也尝试执行 goose命令使用 exec.Command() 但它始终返回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)
  }

enter image description here

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

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

为什么 exec.Command() 一直返回 code status 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/

相关文章:

python - 在 Web2py 上显示文件夹中的一组图像

php - 使用 PhpMyAdmin 同步数据库

php - 在不提供链接标识符的情况下查询数据库是不好的做法吗?

node.js - 测试 Express response locals

sql - 如何为这种情况正确设计数据库模式

javascript - 如何测试嵌入js脚本库中的DOM方法?

android - 如何在 Android Instrumentation 测试中强制改变方向?

MongoDB Atlas 未连接到我的 golang 应用程序

go - 如何获取 slice 的最后一个元素?

javascript - 检测 base64 dataURL 图像中的恶意代码或文本