我正在尝试使用此golang语句将sql文件运行/加载到mysql数据库中,但这不起作用:

1
exec.Command("mysql","-u","{username}","-p{db password}","{db name}","<", file abs path )

但是当我在Windows命令提示符下使用以下命令时,ita工作正常。

1
mysql -u {username} -p{db password} {db name} < {file abs path}

那是什么问题?

  • 尝试exec.Command(" C "," mysql","-u"," {用户名}","-p {db密码}"," {db名称}"," <",文件abs路径)。跑()
  • " C "-此字符串代表什么?
  • 如果我没记错的话,它从C驱动器运行cmd,因为它解决了我的问题

正如其他人回答的那样,您不能使用<重定向运算符,因为exec不使用shell。

但是您不必重定向输入即可读取SQL文件。您可以将参数传递给MySQL客户端以使用其source命令。

1
2
exec.Command("mysql","-u","{username}","-p{db password}","{db name}",
   "-e","source {file abs path}" )

source命令是MySQL客户端的内置命令。参见https://dev.mysql.com/doc/refman/5.7/en/mysql-commands.html


Go的os.exec软件包不使用外壳程序,并且不支持重定向:

Unlike the"system" library call from C and other languages, the os/exec package intentionally does not invoke the system shell and does not expand any glob patterns or handle other expansions, pipelines, or redirections typically done by shells.

您可以显式调用该外壳以将参数传递给它:

1
cmd := exec.Command("/bin/sh", yourBashCommand)

根据您的操作,编写简短的bash脚本并从Go调用它可能会有所帮助。

  • 我是Windows用户。
  • 是的,那么bash不适合您。我假设有一些现代有用的shell命令可以在Windows中调用-或可以运行的Shell脚本文件-但我不是Windows专家。 Mysql的source(以上)可能是解决您问题的最简单方法。希望您仍然可以从软件包说明文件中找到摘录。

Go的exec.Command将第一个参数作为程序运行,其余参数作为参数运行。 '<'被解释为文字参数。

例如exec.Command("cat","<","abc")是bash中的以下命令:cat \\< abc

要做您想做的事情,您有两种选择。

  • 运行(ba)sh并将命令作为参数:exec.Command("bash","-c","mysql ... < full/path")
  • 手动通过管道传输文件内容。有关详细信息,请参见https://stackoverflow.com/a/36383984/8751302。

bash版本的问题是不能在不同的操作系统之间移植。在Windows上将无法使用。