首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用exec.Command在golang中执行Mysql脚本

问如何使用exec.Command在golang中执行Mysql脚本
EN

Stack Overflow用户
提问于 2017-10-23 17:02:19
回答 2查看 3.6K关注 0票数 2

嗨,我正在执行一个脚本,用Golang将数据填充到数据库中。

代码语言:javascript
复制
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)
    }
}

问题是我得到了错误:

代码语言:javascript
复制
ERROR 1049 (42000): Unknown database '< /Users/XXX/Documents/test/scripts/olds/SCRIPT_XXX.sql'

我认为问题是exec认为的最后一个param ( sql脚本路径)是dbname。

终端中的以下命令正在工作:

代码语言:javascript
复制
/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程序将数据插入到数据库中。

有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-23 17:23:19

+1回答@MatteoRagni关于如何在Golang重定向的问题。

但这里有一个简单的替代方案,我使用:

代码语言:javascript
复制
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。

票数 6
EN

Stack Overflow用户

发布于 2017-10-23 17:17:38

这是一个运行如下所示的小示例:

代码语言:javascript
复制
cat < test.txt

这就是我认为您在代码中缺少的内容:

代码语言:javascript
复制
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所读取的。你需要让它适应你的问题。

类似于:

代码语言:javascript
复制
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)
    }
}

如果我没有错的话..。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46894765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档