嗨,我正在尝试执行脚本以使用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程序以将数据插入数据库中。
有什么建议?
+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>。
source <scriptname>
PS:我也不会在代码中输入主机,端口,用户和密码。这意味着,只要更改这些连接参数,就必须重新编译程序。同样,在命令行上以纯文本格式使用密码也不安全。相反,我将所有连接参数放入默认文件中并使用mysql --defaults-file=FILENAME。
mysql --defaults-file=FILENAME