로컬 Postgres 테이블을 로컬 컴퓨터의 CSV 파일로 내보내기


15

원격 서버의 데이터베이스에 대한 읽기 전용 액세스 권한이 있습니다. 따라서 다음을 실행할 수 있습니다.

COPY products TO '/tmp/products.csv' DELIMITER ',';

그러나 해당 서버에는 파일을 만들거나 저장할 수있는 권한이 없으므로 로컬 컴퓨터에서이 작업을 수행해야합니다.

원격 데이터베이스에 연결할 때 원격 서버 대신 로컬 컴퓨터에 파일을 저장하는 명령을 어떻게 실행할 수 있습니까?

또는 Linux 명령을 실행하여 원격 데이터베이스에 연결하고 쿼리를 실행하고 출력을 파일로 로컬 시스템에 저장하려면 어떻게해야합니까?

답변:


29

이미 제안 된 두 가지 접근 방식은 불필요하게 복잡해 보입니다.

그냥 사용하는 psql내장의 \copy단지 서버 측처럼 작동 명령, COPY하지만 클라이언트와 사용 클라이언트 경로에 와이어 프로토콜을 통해 복사본을한다.

psql백 슬래시 명령 이므로 뒤에 오는 세미콜론을 생략합니다. 예 :

\copy products TO '/tmp/products.csv' CSV DELIMITER ','

자세한 내용 은 명령 \copy의 설명서psqlCOPY명령 문서 를 참조하십시오.

데이터를 복사 할 때 (입력하지는 않지만) 테이블 이름 대신 쿼리 와 함께 COPY사용할 수있는 것처럼 .\copy(SELECT ...)


몇 가지 제한된 상황에서 유용 할 수있는 대체로 열등한 대안은 다음을 사용하는 것입니다.

psql -t -P format=unaligned -P fieldsep_zero=on -c 'SELECT * FROM tablename'

그리고 사용하는 -o파일로 출력을 작성하는 플래그 또는 쉘 출력 리디렉션. 거의 항상 \copy이것보다 선호해야합니다.


그러나 이것은 거래를 허용하지 않습니다 :(
Reza S

음, 그렇습니다. here 문서를 사용하여로 psql시작 BEGIN하고 \copy명령 을 수행 한 다음 a를 입력하여 스크립트 를 공급 하십시오 COMMIT. 또는 psql -fhere-document를 사용하지 않고 스크립트를 실행하는 데 사용하십시오.
Craig Ringer

돌아와 주셔서 감사합니다 ... 그게 끝났고 작동했습니다 =)
Reza S

-A대신에 사용할 -P format=unaligned수도 있고 필요하다고 생각합니다.-P fieldsep=,
Evan Carroll

2

Linux 명령은 다음과 같습니다.

psql -h 127.0.0.1 -U username -o file.csv -c 'select id, name from clients;'

1
CSV를 생성하지 않고 형식화 된 텍스트 출력을 생성합니다. -t -P format=unaligned 이 명령에 추가 하면 버그가 많은 파이프로 구분 된 CSV와 같이 조금 더 가까이 있지만 텍스트의 파이프는 이스케이프 처리되지 않으므로 유효하지 않습니다.
Craig Ringer

또한 -P fieldsep=','이스케이프 부족으로 인해 오류가 발생할 가능성이 더 높다는 점을 제외 하고는 원합니다 . -P fieldsep_zero=on널 바이트로 구분 된 텍스트를 구문 분석하지 않아도 psql출력에서 자연스럽게 널 바이트가 발생할 수 없으므로 괜찮습니다 .
Craig Ringer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.