我正在尝试使用此golang语句运行/加载sql文件到mysql数据库,但这不起作用:
exec.Command("mysql", "-u", "{username}", "-p{db password}", "{db name}", "<", file abs path )
但是当我在Windows命令提示符下使用以下命令时,它工作正常。
mysql -u {username} -p{db password} {db name} < {file abs path}
那么问题是什么?
答案 0 :(得分:2)
正如其他人已经回答的那样,您无法使用<
重定向运算符,因为exec
没有使用shell。
但是您不必重定向输入以读取SQL文件。您可以将参数传递给MySQL客户端以使用其source
命令。
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
答案 1 :(得分:1)
Go的exec.Command将第一个参数作为程序运行,其余参数作为参数。 '&lt;'被解释为文字参数。
e.g。 exec.Command("cat", "<", "abc")
是bash中的以下命令:cat \< abc
。
要做你想做的事,你有两个选择。
exec.Command("bash", "-c", "mysql ... < full/path")
bash版本的问题是在不同的操作系统之间无法移植。它不适用于Windows。
答案 2 :(得分:1)
Go os.exec
package不使用shell,不支持重定向:
与来自C和其他语言的“系统”库调用不同,os / exec包有意不会调用系统shell,也不会扩展任何glob模式或处理通常由shell完成的其他扩展,管道或重定向。 / p>
您可以显式调用shell以将参数传递给它:
cmd := exec.Command("/bin/sh", yourBashCommand)
根据您正在做的事情,编写一个简短的bash脚本并从Go调用它可能会有所帮助。