로컬 Postgres 테이블을 로컬 컴퓨터의 CSV 파일로 내보내기 작업을 수행해야합니다. 원격 데이터베이스에 연결할 때 원격

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

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

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

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

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



답변

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

그냥 사용하는 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이것보다 선호해야합니다.


답변

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

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