2012-03-05 169 views
2

我在寫一個groovy腳本,它需要將數據從文件複製到表(Postgres數據庫)中。 我可以使用SQL命令COPY,但這需要腳本以超級用戶身份運行(這不是我可以使用的選項)。另一種方法是使用\ COPY,它是一個psql命令。但psql是PostgresSQL的命令行工具。有沒有辦法從Groovy腳本中調用\ COPY?從Groovy腳本調用psql命令

我試過如下:

// groovy method to populate table 
populateTable(tableName, filePath) { 

    def command = """psql -U<database name>""" 
    def proc = command.execute()     
    proc.waitFor()         

    command = """ \\COPY $tableName FROM '$filePath' WITH DELIMITER AS ','""" 
    proc = command.execute()     
    proc.waitFor() 
} 

我試圖在上面的代碼做的是登錄到psql的命令行,然後運行\ COPY命令,但我得到了以下錯誤:

java.io.IOException: Cannot run program "\COPY": java.io.IOException: error=20, Not a directory 

只是想知道是否可以從腳本調用\ COPY?如果沒有,是否有其他方法可以將文件中的數據批量複製到表格中?它的一個巨大的文件,並逐行復制將是非常低效的。

非常感謝您的幫助。

回答

1

您的代碼當前正在執行兩項單獨的事情psql\COPY(根據您輸入的錯誤消息未找到該代碼)。我不熟悉的Postgres如MySQL,但是看psqldocumentation它看起來像你可以在命令通過使用-c參數運行:

def populateTable(tableName, filePath) { 
    def sql = """ \\COPY $tableName FROM '$filePath' WITH DELIMITER AS ',' """ 
    def command = """psql -U<database name> -c "$sql" """ 
    def proc = command.execute() 
    proc.waitFor() 
} 
+0

感謝您的答覆。我試過上面的代碼。當我展開def命令時,這是我得到的結果: – rjane 2012-03-06 00:16:32

+0

您是否得到空字符串或在剪切和粘貼時出現問題? – 2012-03-06 00:21:48

+0

感謝您的回覆。我試過上面的代碼。當我打印出def命令時,這是我得到的:'code'psql -Usomedatabase -c「\\ COPY tablename FROM'filename'WITH DELIMITER AS','''code'我複製並粘貼到命令行上,並執行該命令很好。但是,當我從腳本運行它時,出現錯誤,表明命令周圍的雙引號(在-c參數之後)無法識別。如果我從命令行運行此命令時刪除雙引號,則會得到相同的錯誤。有什麼建議麼? – rjane 2012-03-06 00:26:44