2012-06-10 71 views
0

我正在嘗試編寫一個將mysql轉儲導入數據庫的函數。我的代碼如下所示:Grails MySQL導入轉儲

def sout = new StringBuffer() 
def serr = new StringBuffer() 
String pathToDump = "C:\\Users\\Lojza\\AppData\\Local\\Temp\\protetika-dump-temp-13393134598714336471323836046295.sql" 
def process = "mysql --host=localhost --user=protetika --password=protetika --port=3306 --default-character-set=utf8 < \"${pathToDump}\" ".execute() 
process.consumeProcessOutput(sout, serr) 
process.waitForOrKill(10000) 
println 'sout: ' + sout // => test text 
println 'serr: ' + serr 

我試圖在Grails的控制檯這段代碼,但它返回我:

mysql Ver 14.14 Distrib 5.5.21, for Win64 (x86) 
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. 

Oracle is a registered trademark of Oracle Corporation and/or its 
affiliates. Other names may be trademarks of their respective 
owners. 

Usage: mysql [OPTIONS] [database] 
    -?, --help   Display this help and exit. 
...... (and many more lines) 

我想不出有什麼錯上面的代碼......當我嘗試在cmd中執行生成的進程行,它可以工作並執行到數據庫的導入。我執行的命令是這樣的:

mysql --host=localhost --user=protetika --password=protetika --port=3306 --default-character-set=utf8 < "C:\Users\Lojza\AppData\Local\Temp\protetika-dump-temp-13393134598714336471323836046295.sql" 

感謝您的幫助!

問候,

Lojza

+0

你的轉儲文件來處理標準輸入重定向是CMD語法:它不是由在時尚解析'.execute()',它被理解爲是'mysql'的附加(無法識別的)參數。我不知道Grails,但是您需要以其他方式將您的轉儲文件重定向到'mysql'進程的stdin。 – eggyal

+0

不知道你的用例是什麼,但有一堆處理操作數據庫的插件......比如LiquiBase – chrislovecnm

+0

謝謝你們。至於LiquiBase,我不知道。現在學習和實施它爲時已晚,因爲它是項目的最後一天:)但下次也許。 –

回答

1

重定向,因爲它與Windows命令提示符確實不起作用的Java下以同樣的方式。解決這個問題的方法是使用-e選項執行source命令來讀取文件。因此,在命令行中,你可以做

mysql --host=localhost --user=protetika --password=protetika --port=3306 --default-character-set=utf8 –e 「source C:\Users\Lojza\AppData\Local\Temp\protetika-dump-temp-13393134598714336471323836046295.sql" 

代碼從常規(未經測試)做到這一點,

def process = "mysql --host=localhost --user=protetika --password=protetika --port=3306 --default-character-set=utf8 -e \"source "${pathToDump}\"\" ".execute() 
+0

謝謝,你的代碼是正確的! –