2017-07-30 31 views
0

我目前正在学习Golang的网页编程,现在我继续学习数据库,Rest API和Golang测试。不能让Goose数据库迁移工作Go测试

,现在我得到Goose数据库迁移和转到测试整合的问题。

我想将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都以相同的方式工作做好)?

+0

请勿张贴文字的图像。它们不可搜索,或者始终可读。请复制并粘贴所有文字内容。 – Flimzy

+0

为了解决您的问题:'是否可以从Go Code内部触发迁移(上/下/重置)?'可以做任何你想做的事情。你有什么尝试?你遇到了什么问题? – Flimzy

+0

@Flimzy就像我之前说过的那样,我需要在测试运行之前迁移所有迁移,然后在测试完成后迁移重置。 –

回答

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

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

定义的Run FUNC这需要论证command字符串参数还有db字符串。

但是,如果你想仍与execCommand工作,那么也许你可以看看goose_test.go文件,其中将参数传递dir在迁移要运行的可能。

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