当前位置: 首页 > 面试题库 >

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

公孙茂学
2023-03-14
问题内容

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

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



 类似资料:
  • 我感觉栽在这上面好多次了…… 示例命令: commandStr 在cmd中执行: 输出: 可以证明上面的命令是正确的。 在 go: 报错1: `Output: '\"d:/可能包含空格/magick.exe\"' �����ڲ����ⲿ���Ҳ���ǿ����еij��� ���������ļ���` 乱码我无能为力,但看输出,貌似是转义,这莫名其妙,但我先去掉magick.exe的引号 报错2:

  • 问题内容: 如何使用exec.command启动带有空格的文件?添加引号似乎无效,“或%20代替空格也不起作用。 问题答案: 这有效,但仅在Windows中

  • 问题内容: 我无法执行长脚本,PDO引发异常: 如果我提交的脚本不包含变量,它将运行而不会出现问题。相同的脚本在phpmyadmin界面上运行。 这是我的代码段: 这是一些不能由PDO执行的测试: 我应该如何用pdo执行多行脚本? 感谢 阿曼。 问题答案: PDO不允许在一个query()请求中执行多个语句。但是您的@ra_LMC变量应该在当前连接中可见,因此您可以将第二行(SELECT)放入新的

  • 问题内容: Go对于此SQL查询中的第二个参数想要什么。我正在尝试在postgres中使用查找。 我真正想要的是: 问题答案: 查询只是使用varargs来替换sql中的参数,因此,在您的示例中,您只需要执行 例如,这个和第二个示例的内容是动态的,那么您将 如果“ IN”部分具有可变的args,则可以执行(播放)

  • 问题内容: 我试图找出一种从Golang执行脚本(.sh)文件的方法。我发现了几种简单的执行命令的方法(例如os / exec),但是我要执行的是执行整个sh文件(该文件设置了变量等)。 为此,使用标准的os / exec方法似乎并不简单:尝试输入“ ./script.sh”并将脚本内容加载到字符串中都不能用作exec函数的参数。 例如,这是我要从Go执行的sh文件: 从Go程序中: 其中mong

  • 我目前正在查看这个文档,以便使用R和taskscheduleR在我的机器上自动运行一个脚本。我对本文档中的以下内容感到困惑: 在文档中的示例中,什么是“extdata”,这应该是我的R脚本的文件路径,并且是“helloworld”。R“实际的R脚本? 我目前对此的理解如下:其中C:/Users/santi/Documents/R Scripts是我的文件路径,Wayerhaeuser_Automa