なぜそれが落ちているのかわかりませんが、私の推測では、それは mysql が選択呼び出しを引用符で囲んで処理している方法です...
回避策として、これは機能します:
[ 'mysql',
'-h', 'localhost',
'-u', 'root',
'my_database',
'-e', 'select count(*) from page' ].execute().text
text
出力を処理するより良い方法は、バッファがいっぱいになった場合のブロッキングの問題を軽減するため、( を使用するのではなく) 出力を消費することです....
何かのようなもの:
String output = new StringWriter().with { writer ->
[
'mysql',
'-h', 'localhost',
'-u', 'root',
'my_database',
'-e', 'select count(*) from page'
].execute().with { proc ->
consumeProcessOutput( writer, writer )
waitFor()
}
writer.toString()
}
println output
編集:
もちろん、いつでも JDBC を使用できます。
@GrabConfig(systemClassLoader=true)
@Grab('mysql:mysql-connector-java:5.1.21')
import groovy.sql.Sql
def rowcount = Sql.newInstance( 'jdbc:mysql://localhost/my_database', 'root', '', 'com.mysql.jdbc.Driver' ).with { sql ->
def count = sql.firstRow( 'select count(*) from page' )[ 0 ]
sql.close()
count
}
println rowcount
説明
次のようなシェル スクリプトを記述した場合 (および名前を付けて保存した場合/tmp/run.sh
):
#!/bin/bash
for var in "$@"
do
echo "$var"
done
次に、実行すると:
println( '/tmp/run.sh "select count(*) from page"'.execute().text )
groovy は単純な形式の を呼び出し、次のRuntime.getRuntime.exec()
ように出力します。
"select
count(*)
from
page;"
ご覧のとおり、select
ビットを単語に分割するため、パラメーターはすべてめちゃくちゃになります。
代わりに呼び出す場合:
println( [ '/tmp/run.sh', '"select count(*) from page"' ].execute().text )
次のように出力されます。
"select count(*) from page"
groovy がのString[]
形式をRuntime.exec
呼び出すので、Java はさまざまなパラメーターが何であるかを推測する必要がないため、select
すべてを 1 つのパラメーターに保持します。
これがそれを説明することを願っています:-)