【问题标题】:Mysql Script in Go using exec.Command使用 exec.Command 在 Go 中编写 Mysql 脚本
【发布时间】:2020-04-25 09:52:45
【问题描述】:

我正在尝试执行 MySQL 查询,该查询将输出作为 CSV 文件输出到指定目录。

func executeCommand(){
    cmd := exec.Command("/usr/local/mysql/bin/mysql", "-e", "-hlocalhost", "-P3131", "-uroot", "-pmyPassword", "dbName",  "> /path/to/output/folder/fileName.csv")
    var out bytes.Buffer
    var stderr bytes.Buffer
    cmd.Stdout = &out
    cmd.Stderr = &stderr
    err = cmd.Run()
    if err != nil {
        fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
    }
    fmt.Println("Result: " + out.String())
}

我收到以下错误:

退出状态1:mysql: [警告] 在命令行使用密码 接口可能不安全。

当我删除输出目录路径时,没有错误。 但我需要将我的输出生成文件放到指定目录中。

我也尝试用source 替换>,但没有成功。 此外,当我在终端上运行相同的程序时,它按预期工作,但我无法通过 Go 复制相同的内容。

/usr/local/mysql/bin/mysql -e "select * from tableName" -u root -p -h localhost -P 3131 dbName > /path/to/output/folder/fileName.csv

我尝试在 SO 上进行搜索,但找不到任何相关内容。 任何帮助将不胜感激。

【问题讨论】:

标签: mysql go terminal


【解决方案1】:

> 是用于输出重定向的 shell 元字符。当您在 shell 中运行命令时,shell 会预先解析您的命令并通过输入/输出重定向执行特殊操作。它不会将重定向元字符传递给程序。但是当你使用exec.Command() 时,你只给出你想要传递给命令的参数。

如果要保存命令的输出,则需要使用 cmd.Stdout 缓冲区。

另见How to execute Mysql Script in golang using exec.Command

【讨论】:

  • 我看到了你的回答,但我只是想知道,我应该写什么来代替'
  • 您需要编写代码来写入命令的标准输入并从其标准输出中读取。有关示例,请参阅golang.org/src/os/exec/example_test.go
  • 我使用了我的 cmd.Stdout 缓冲区并将该缓冲区保存到文件中。早些时候我被 exec.Command 困住,认为它会直接将其输出到文件中。感谢您清除此问题。
猜你喜欢
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多