2012-03-05 3 views
2

파일에서 테이블 (Postgres 데이터베이스)으로 데이터를 복사해야하는 그루비 스크립트를 작성했습니다. SQL 명령 COPY를 사용할 수는 있지만 수퍼 유저 (이 옵션은 사용할 수 없음)로 실행해야합니다. 또 다른 대안은 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

귀하의 코드는 현재 psql\COPY의 두 가지 별도의 항목 (사용자가 입력 한 오류 메시지가 표시되지 않음)을 실행하고 있습니다. 내가 MySQL을만큼 익숙하지 않은 포스트 그레스를 해요,하지만 당신은 -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

답변 해 주셔서 감사합니다. 나는 위의 코드를 시도했다. 'psql -Usomedatabase -c "\\ COPY tablename FROM'filename 'from DELIMITER AS', '"'code '이 명령을 복사하여 붙여 넣은 다음, 명령이 잘 실행되었습니다. 그러나 스크립트에서 실행할 때 명령을 둘러싼 큰 따옴표 (-c 인수 뒤)가 인식되지 않는다는 오류가 발생합니다. 명령 줄에서이 명령을 실행할 때 큰 따옴표를 제거하면 동일한 오류가 발생합니다. 어떤 제안? – rjane

관련 문제