一尘不染

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

go

嗨,我正在尝试执行脚本以使用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'

我认为问题是执行人员认为是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中复制以自动执行脚本。

该脚本具有删除表,创建表,插入和具有FK关系的PK,这是一个非常完整的脚本,因此我无法逐行执行,因此我决定执行de mysql程序以将数据插入数据库中。

有什么建议?


阅读 546

收藏
2020-07-02

共1个答案

一尘不染

+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")

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

PS:我也不会在代码中输入主机,端口,用户和密码。这意味着,只要更改这些连接参数,就必须重新编译程序。同样,在命令行上以纯文本格式使用密码也不安全。相反,我将所有连接参数放入默认文件中并使用mysql --defaults-file=FILENAME

2020-07-02