如何使用exec.Command在golang中执行Mysql脚本

时间:2017-10-23 17:02:20

标签: mysql shell go terminal

您好我正在尝试使用Golang执行脚本将数据填充到数据库中

func executeTestScript(){
    cmd := exec.Command("/usr/local/mysql/bin/mysql", "-h127.0.0.1", "-P3333", "-uusr", "-pPassxxx", "-Ddtb_test",  "< /Users/XXX/Documents/test/scripts/olds/SCRIPT_XXX.sql")

    var out, stderr bytes.Buffer

    cmd.Stdout = &out
    cmd.Stderr = &stderr

    err := cmd.Run()
    if err != nil {
        fmt.Println(fmt.Sprintf("Error executing query. Command Output: %+v\n: %+v, %v", out.String(), stderr.String(), err))
        log.Fatalf("Error executing query. Command Output: %+v\n: %+v, %v", out.String(), stderr.String(), err)
    }
}

问题是我收到错误:

ERROR 1049 (42000): Unknown database '< /Users/XXX/Documents/test/scripts/olds/SCRIPT_XXX.sql'

我认为问题是exec认为是dbname的最后一个参数(sql脚本路径)

终端中的以下命令正在运行:

/usr/local/mysql/bin/mysql --host=127.0.0.1 --port=3333 --user=usr --password=Passxxx --database=dtb_test < /Users/XXX/Documents/roseula/scripts/olds/SCRIPT_XXX.sql

但我尝试在Go中复制以自动执行脚本。

脚本有丢弃表,创建表,插入和PK与FK关系是一个非常完整的,所以我不能逐行执行,因为我决定执行de mysql程序将数据插入数据库。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

+1从@MatteoRagni回答,展示了如何在Golang中进行stdin重定向。

但这是我使用的一个简单的替代方案:

cmd := exec.Command("/usr/local/mysql/bin/mysql", "-h127.0.0.1", "-P3333", 
  "-uusr", "-pPassxxx", "-Ddtb_test",
  "-e", "source /Users/XXX/Documents/test/scripts/olds/SCRIPT_XXX.sql")

您不必使用stdin重定向使mysql客户端读取脚本。相反,您可以使mysql客户端执行特定命令,即source <scriptname>

P.S。:我也不会在您的代码中放置主机,端口,用户和密码。这意味着您必须在更改这些连接参数时重新编译程序。在命令行上以明文形式使用密码也是不安全的。相反,我将所有连接参数放入默认文件并使用mysql --defaults-file=FILENAME

答案 1 :(得分:1)

这是一个运行类似的例子:

cat < test.txt

这就是我认为您在代码中遗漏的内容:

package main

import (
  "fmt"
  "os/exec"
  "os"
)

func main() {

  cmd := exec.Command("cat")
  file, _ := os.Open("test.txt")

  cmd.Stdin = file

  out, _ := cmd.Output()

  fmt.Printf("%s\n", out)
}

在控制台中打印test.txt的内容,由cat读取。您需要根据自己的问题进行调整。

类似的东西:

func executeTestScript(){
    cmd := exec.Command("/usr/local/mysql/bin/mysql", "-h127.0.0.1", "-P3333", "-uusr", "-pPassxxx", "-Ddtb_test")

    dump, dump_err = os.Open("/Users/XXX/Documents/test/scripts/olds/SCRIPT_XXX.sql")
    if dump_err != nil {
      /* Handle the error if file not opened */
    }
    cmd.Stdin = dump

    var out, stderr bytes.Buffer

    cmd.Stdout = &out
    cmd.Stderr = &stderr

    err := cmd.Run()
    if err != nil {
        fmt.Println(fmt.Sprintf("Error executing query. Command Output: %+v\n: %+v, %v", out.String(), stderr.String(), err))
        log.Fatalf("Error executing query. Command Output: %+v\n: %+v, %v", out.String(), stderr.String(), err)
    }
}

如果我没错......