PostgreSQL에서 제목이있는 테이블을 CSV로 내보내는 방법은 무엇입니까?


418

제목이있는 PostgreSQL 테이블을 명령 줄을 통해 CSV 파일로 내보내려고하지만 제목이없는 CSV 파일로 내보낼 수 있습니다.

내 코드는 다음과 같습니다.

COPY products_273 to '/tmp/products_199.csv' delimiters',';

postgres> = 8.1을 사용하고 있습니까?
Dana the Sane

1
새로운 버전으로 업그레이드 할 계획을 세우고 인생을 훨씬 더 쉽게 만들 것입니다.
Elitmiar

답변:


594
COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);

설명서에 설명 된대로 .


7
HEADER 인수는 8.1까지 도입되지 않았습니다.
Dana the Sane

7
즉, 조금 녹슨 것입니다.
Milen A. Radev

65
참고 COPY관리자 권한이 필요합니다. \COPY문제가 발생하면 대신 사용하십시오 .
fny mar

5
이는 "DELIMITER ','"보다 "FORMAT csv"를 사용하는 것이 더 적합하지 않은 출력을 제공 할 수 있습니다. 확실하지 버전을하는 생각에 도착 것을
grahamrhay

37
v9.5의 경우, 명령은 다음과 같습니다COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
Shubham Goyal

223

psql 명령 행에서 :

\COPY my_table TO 'filename' CSV HEADER

끝에 세미콜론이 없습니다.


22
이 버전은 같은 최고의 지금까지 COPY명령은 관리자 권한을 필요로
마태 복음 O'RIORDAN

2
또한 psql접근 방식을 사용하면 액세스 권한이있는 모든 위치에 출력을 저장할 수 있습니다. 방금 psql원격 서버에서 로컬 파일로 데이터를 가져 오는 방법을 사용했습니다 . 매우 매끄 럽습니다.
Ian Gow

특히 액세스 권한이 있지만 postgres 사용자는 액세스 할 수없는 디렉토리에 저장할 때 훨씬 좋습니다.
Steve Bennett

2
@arilwan 사용 pg_dump -h remote | pg_restore -h localhost.
Ian Gow

4
@arilwan psql -c "\COPY (SELECT * FROM mytable) TO STDOUT" > mytable.csv
Juha Palomäki 2016

122

테이블 이름 대신 선택된 열 데이터 만 가져 오는 쿼리를 작성할 수도 있습니다.

COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;

관리자 권한으로

\COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;

psql 버전의 명령 ( \COPY ...) 에서 종결 세미콜론이 필요하다고 생각하지 않습니다 . 그리고 적어도 내 버전의 psql (9.5.2)에서는 'DELIMITER'를 지정할 필요가 없었습니다. 기본값은 쉼표입니다.
user1071847

CSV에서 선택한 필드의 표로 복사하는 경우 구문이 어떻게 변경되는지
user269867

99

Postgres에서 파일을 쓸 수있는 권한이 없으면 명령 줄에서 쿼리를 실행할 수 있습니다.

psql -U user -d db_name -c "Copy (Select * From foo_table LIMIT 10) To STDOUT With CSV HEADER DELIMITER ',';" > foo_data.csv

7
"모든 환경"에 가장 적합합니다. 모범 1. PostgreSQL을에서 또는 클라이언트에서 특별한 권한이 필요하지 않습니다; 2. 상대 경로를 사용할 수 있습니다; 그리고 3. 실제 CSV 형식 (보안 인용)에 대한 안전합니다.
피터 크라우스

34

이 작동합니다

psql dbname -F , --no-align -c "SELECT * FROM TABLE"

10
좋은. 이것은 쉼표를 포함하는 필드 내에서 쉼표를 이스케이프하지 않는 것 같습니다.
재귀 적으로 Ironic

나는 이것을없이 좋아 하고 구분 기호로 -F ,사용 |합니다. 감사!
dsummersl

2
이것은 일반적으로 내보내기 기능으로 간주되는 것이 아니라 제어 된 데이터 표시입니다. 차이점은 가볍지 만 중요합니다. 이것은 COPY재사용 할 파일을 만드는 설명 보다 사람이 읽을 수 있습니다.
Romain G

7
위험 CSV 형식이 아니며 ","가 포함 된 배열 또는 텍스트에는 작동하지 않습니다. 올바른 CSV 인용을하지 않습니다. @Brian의 답변을 사용하십시오.
피터 크라우스

8

내가 사용하는 버전 9.5의 경우 다음과 같습니다.

COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);

7

이 솔루션은을 사용하여 저에게 효과적 \copy이었습니다.

psql -h <host> -U <user> -d <dbname> -c "\copy <table_name> FROM '<path to csvfile/file.csv>' with (format csv,header true, delimiter ',');"

4

가장 간단한 방법 (을 사용 psql)은 --csv플래그 를 사용하는 것 같습니다 .

psql --csv -c "SELECT * FROM products_273" > '/tmp/products_199.csv'

PostgreSQL 버전 12 이상에서만 작동합니다.
Dirk

3

다음은 pgsl connnect를 사용하여 Heroku PG 데이터베이스에 작동 셸을 얻는 방법입니다.

먼저 클라이언트 인코딩을 다음과 같이 utf8로 변경해야했습니다. \encoding UTF8

그런 다음 데이터를 CSV 파일로 덤프했습니다.

\copy (SELECT * FROM my_table) TO  C://wamp64/www/spider/chebi2/dump.csv CSV DELIMITER '~'

CSV 파일이 마음에 들지 않기 때문에 ~를 구분 기호로 사용했습니다. 일반적으로 TSV 파일을 사용하지만 구분 기호로 '\ t'를 추가 할 수 없으므로 ~ 는 거의 사용하지 않는 문자 때문에 ~를 사용했습니다.


0

'fileablsoutepathwihname'구분 기호 ','csv 헤더에 복사 (anysql 쿼리 datawanttoexport);

이 u를 사용하면 데이터를 내보낼 수도 있습니다.


0

여기에 주어진 다른 답변들 중 어느 것도 실제로 나를 위해 일하지 않았기 때문에이 답변을 게시하고 있습니다. 나는 사용할 수 없었다COPY올바른 권한이 없기 때문에 Postgres 내에서 . 그래서 "눈금 행 내보내기"를 선택하고 출력을 UTF-8로 저장했습니다.

psql@ 브라이언에 의해 주어진 버전은 또한 다른 이유로 나를 위해 작동하지 않았다. 그것이 작동하지 않는 이유는 Windows 명령 프롬프트 (Windows를 사용하고 있었음)가 인코딩 자체를 방해하고 있었기 때문입니다. 이 오류가 계속 발생했습니다.

오류 : "WIN1252"인코딩에서 바이트 시퀀스가 ​​0x81 인 문자가 "UTF8"인코딩에서 동일하지 않습니다.

내가 사용한 해결책은 CSV 파일을 읽고 Postgres 테이블에 직접 insert 문을 발행하는 짧은 JDBC 스크립트 (Java)를 작성하는 것이 었습니다. 이것은 작동했지만 인코딩을 변경하지 않은 경우 명령 프롬프트도 작동했을 것입니다.


0

다음을 시도해보십시오 : "COPY products_273 FROM '\ tmp \ products_199.csv'DELIMITER ','CSV HEADER"

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.