您好我正在尝试使用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程序将数据插入数据库。
有什么建议吗?
答案 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)
}
}
如果我没错......