2012-05-04 46 views
0

從我的Ant腳本調用SQLite時,我需要同時使用.separator和.import,但似乎無法獲得正確的語法。基於這個關於在bash腳本中做同樣事情的答案,我最近的嘗試是這樣的。通過Ant將多個參數傳遞給SQLite

<exec executable="sqlite3"> 
    <arg value="${sqlite.db}" /> 
    <arg value=".separator ';'\n.import ${data.dir}/DISTRICT_BOUNDARY.txt DISTRICT_BOUNDARY" /> 
</exec> 

不幸的是,這會導致以下錯誤消息。

錯誤:未知命令或無效參數:「分隔符」。輸入「.help」尋求幫助

什麼是我正在嘗試做的正確語法?

最終的解決方案:

<exec executable="sqlite3" inputstring=".separator ';'&#10;.import ${data.dir}/METADATA_DESCRIPTION.txt METADATA_DESCRIPTION"> 
    <arg value="${sqlite.db}" /> 
</exec> 
+0

您的腳本示例未顯示。你還可以包含一個指向你所提到的SO答案的鏈接嗎? –

+0

我似乎無法找到其他線程,很奇怪。我仍然遇到麻煩,甚至無法使它在命令行上工作。任何幫助導入一個;從命令行和/或Ant分隔文件到SQLite非常感謝。 – bclinkinbeard

回答

1

您似乎無法通過sqlite3的最後一個參數傳遞元命令(即以.開頭的命令)只有實際的SQL語句似乎在那裏工作[*]。有兩種可能的修復方法;或者將元命令寫入文件並使用-file filename選項(數據庫名稱前的兩個參數)加載它們,或者在sqlite3的標準輸入中傳遞整個多語句指令集。這第二個選項應該是簡單的爲您與螞蟻落實,通過inputstring參數:

<exec executable="sqlite3" inputstring=".separator ';' 
.import ${data.dir}/DISTRICT_BOUNDARY.txt DISTRICT_BOUNDARY"> 
    <arg value="${sqlite.db}" /> 
</exec> 

是的,有一個真正的換行符。與真正的SQL語句不同,您不能用分號分隔元命令。如果您願意,您可以將換行符編碼爲&#10;


[*]實際上,一個元命令可以工作,但不能放兩個。

+0

如果你真的不走運,螞蟻會在其中添加換行符。它不應該發生 - 這將是一個螞蟻的錯誤 - 但我不相信「不應該」太多,我現在不能測試。如果確實存在這種情況,那麼您將無法加載包含要執行的元命令的文件... –

+0

謝謝!幾個筆記。在我的sqlite(3.7.7)版本中,在文件中使用命令的參數是'-init',而不是'-flag'。這工作得很好,但由於需要動態路徑,在我的情況下會是一種痛苦。 我也無法讓它與換行符一起工作,所以我正在使用' ' – bclinkinbeard

+0

@bclinkinbeard很高興它的工作,對不起沒有更好的。 (很多XML解析器甚至不符合符合...) –

0

我覺得螞蟻在你的第二個ARG值作爲字符串分隔符解釋單引號。嘗試逃避單引號:

<arg value=".separator \';\'\n.import${data.dir}/DISTRICT_BOUNDARY.txt DISTRICT_BOUNDARY" /> 

我不熟悉使用SQLite語法,但.IMPORT參數也可能需要一個單獨的ARG值。