嗨,我正在执行一个脚本,用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认为的最后一个param ( sql脚本路径)是dbname。
终端中的以下命令正在工作:
/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的关系--这是一个非常完整的脚本,所以我不能逐行执行,因为我决定执行decided程序将数据插入到数据库中。
有什么建议吗?
发布于 2017-10-23 17:23:19
+1回答@MatteoRagni关于如何在Golang重定向的问题。
但这里有一个简单的替代方案,我使用:
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>。
P.S.:我也不会将主机、端口、用户和密码放在代码中。这意味着无论何时更改这些连接参数,都必须重新编译程序。此外,在命令行中使用明文密码也是不安全的。相反,我会将所有连接参数放入默认文件并使用mysql --defaults-file=FILENAME。
发布于 2017-10-23 17:17:38
这是一个运行如下所示的小示例:
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)
}
}如果我没有错的话..。
https://stackoverflow.com/questions/46894765
复制相似问题