2012-03-05 6 views
2

ファイルからテーブル(Postgresデータベース)にデータをコピーする必要があるGroovyスクリプトを作成しています。 私はSQLコマンドCOPYを使うことができましたが、スクリプトをスーパーユーザー(これは私が使用できるオプションではありません)として実行する必要があります。もう1つの選択肢は、psqlコマンドである\ COPYを使用することです。しかし、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

あなたのコードは現在、2つの別々のものpsql\COPY(入力したエラーメッセージでは見つかりません)を実行しています。私は、MySQLのように馴染みのPostgresないんだけど、あなたは-cパラメータ使用して実行するようにコマンドに渡すことができるようにpsqldocumentationを見てそれが見えます:あなたの応答のための

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

+0

空の文字列を取得するか、カットアンドペーストに問題がありますか? –

+0

お返事ありがとうございます。上記のコードを試しました。私はdefコマンドを出力するとき、これは私が得るものです: 'code' psql -Usomedatabase -c "\\ COPY tablename FROM 'filename' DELIMITER AS '、'" 'code'これをコピーしてコマンドラインに貼り付けました。コマンドは正常に実行されました。しかし、スクリプトから実行すると、コマンドを囲む二重引用符(-c引き数の後ろ)が認識されないことを示すエラーが表示されます。コマンドラインからこのコマンドを実行するときに二重引用符を削除すると、同じエラーが発生します。助言がありますか? – rjane

関連する問題