scala系统调用mysql失败

时间:2016-01-21 23:00:12

标签: mysql scala

我有一个shell脚本   mysql --local-infile = 1 -h myhost -P myport -u me< ./loader_file.sql

当我在命令行中直接运行它时,效果很好。数据被加载到数据库中。

但在scala代码中

val myScript = "mysql --local-infile=1 -h myhost -P myport -u me" #< "loader_file.sql"
myScript !

我收到一条错误消息,说明我的shell中的mysql命令,例如&#34;使用&#34;和#34;加载&#34;找不到。显然,shell将loader_file.sql解释为bash命令而不是mysql命令。

但如果我将整个字符串合并为一个命令

val myScript = "mysql --local-infile=1 -h myhost -P myport -u me < loader_file.sql"

然后我得到一个带有所有有效选项的mysql转储。显然,mysql认为我正在为它提供非法的输入参数。

任何人都知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

以下是您需要从scala代码执行此操作:

import scala.sys.process._

val cmd = Seq("bash","-c","mysql --local-infile=1 -h myhost -P myport -u me < loader_file.sql")

for( line <- cmd.lineStream_! ){
  printf("%s\n",line)
}

这应该适用于linux,OSX,cygwin或类似的(听起来你有这样的环境之一,因为存在bash)。

此特定主题有很多变体,允许您设置默认工作目录,指定环境变量,单独处理STDOUT和STDERR流,以及捕获返回值等。

除了指定环境变量之外,这是一个执行所有操作的版本:

import scala.sys.process._

val cmd = Seq("bash","-c","command with args, blah, blah, blah")
val proc = Process( cmd, new java.io.File(".") )
val exitValue = proc ! ProcessLogger (
  (out) => System.out.printf("stdout:%s\n",out)
  ,
  (err) => System.err.printf("stderr:%s\n",err)
)
printf("exit value: %d\n",exitValue)

scala.sys.process的文档非常好,虽然它假设是linux类型的环境。 shell命令行有时会工作而不用Seq(“bash”,“ - c”,...)包装,但它不是可移植的(例如,Windows java不会将命令行传递给bash)