psql-명령 결과를 파일로 저장


답변:


478

psql의 도움말 ( \?)에서 :

\ o [FILE] 모든 조회 결과를 파일 또는 파이프로 보냅니다.

명령 순서는 다음과 같습니다.

[wist@scifres ~]$ psql db
Welcome to psql 8.3.6, the PostgreSQL interactive terminal

db=>\o out.txt
db=>\dt
db=>\q

1
\ dt 이전에 또는 조합하여 이것을 호출합니까? 구문 감사를 포함하십시오.
pstanton

118
\o다시 입력 하면 꺼집니다.
Carl G

3
슬프게도, 출력은 \?파일로 가지 않습니다. :(
blitzen9872

당신의 친절한 perusual 권한이 거부에 대한 것은 관리자로 psql 프로그램을 실행하려고 말한다
아제 Takur

1
예, \o queries-output.txt이후의 모든 명령 o / p를 이름이 지정된 파일 로 리디렉션 하고 psql 프롬프트에서 다시 queries-output.txt입력 하면이 리디렉션 동작이 되돌려집니다. \o
hygull

95

psql \o명령은 이미 jhwist에 의해 설명되었습니다.

다른 방법은이 COPY TO명령을 사용 하여 서버의 파일에 직접 쓰는 것입니다. 이것은 psql의 표 형식이 아닌 파싱하기 쉬운 형식으로 덤프된다는 장점이 있습니다. 를 사용하여 다른 테이블 / 데이터베이스로 가져 오는 것도 매우 쉽습니다 COPY FROM.

NB! 여기에는 수퍼 유저 권한이 필요 하며 서버 의 파일 기록됩니다 .

예: COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';')

';'로 CSV 파일을 만듭니다. 필드 구분자로.

항상 그렇듯이 자세한 내용은 설명서를 참조하십시오


@helvete에 동의합니다. 여기에 제시된 접근 방식은 사용자가보다 사용자 정의 된 방식으로 출력을 구성 할 수있는 더 많은 기능을 제공합니다.
Nathan Benton

27

\copypostgres 명령은 모든 사용자가 사용할 수 있습니다. \ dt에서 작동하는지 여부를 모르지만 일반적인 구문은 다음 링크 Postgres SQL copy 구문 에서 재현됩니다.

\copy (select * from tempTable limit 100) to 'filenameinquotes' with header delimiter as ','

위는 선택 쿼리의 출력을 csv 파일로 제공된 파일 이름으로 저장합니다.

편집하다:

내 psql 서버의 경우 다음 명령이 작동 합니다. 이전 버전 v8.5입니다.

copy (select * from table1) to 'full_path_filename' csv header;

매우 편리합니다. 감사합니다. 그러나 '... copy to ...'의 'copy'는 필요하지 않습니다. 실제로 최신 버전에서는 명령이 실패합니다.
Tom

톰, 오타 인 것 같아 내 설치를 pgsql의 8.5ver에서 작동 하나 포스트 편집
Aakash 굽타

방금 복사 한 것처럼 \ copy 후에 여러 줄로 된 문장을 붙여 넣고 혼란스러운 구문 오류가 발생하는 사람에게 간단한 참고 사항입니다. \ copy와 같은 줄에서 계속 진행해야합니다.
whoasked

\ copy를 끄는 방법이 있습니까? 예와 같이 명령문을 실행하면 예를 들어 select * from users; 화면에 출력하는 대신 내가 지정한 가장 최근 파일에 결과를 추가합니다. 감사합니다.
raphael75

6

pgsql 명령의 o 매개 변수를 사용하십시오.

-o, --output = FILENAME 조회 결과를 파일로 보내기 (또는 파이프)

psql -d DatabaseName -U UserName -c "SELECT * FROM TABLE" -o /root/Desktop/file.txt

3

COPY tablename TO '/tmp/output.csv' DELIMITER ',' CSV HEADER; 이 명령은 전체 테이블을 csv로 저장하는 데 사용됩니다


postgres에서는 DB 관리자가 필요하지 않도록 COPY를 \ COPY로 대체하는 것이 좋습니다. Windows에서는 파일을 C : \ tmp에 저장합니다.
Jan

3

다음과 같은 오류가 발생하면 ufgtoolspg=> COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';') ; ERROR: must be superuser to COPY to or from a file HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

이런 식으로 실행할 수 있습니다.

psql somepsqllink_or_credentials -c "COPY (SELECT foo, bar FROM baz) TO STDOUT (format csv, delimiter ';')" > baz.csv


2

아래 쿼리를 사용하여 CSV 파일로 결과 저장

\ file (쿼리)을 'file path'csv 헤더에;

\ copy (구매 _ 주문에서 name, date_order 선택) '/home/ankit/Desktop/result.csv'cvs 헤더로;

이것이 당신을 돕기를 바랍니다.


1

내부 psql 명령이 있다고 가정하지만 util-linux-ng 패키지 script에서 명령을 실행할 수도 있습니다 .

DESCRIPTION 스크립트는 터미널에 인쇄 된 모든 것을 타이프 스크립트로 만듭니다.


0

이 방법 원래 명령을 변경하거나 조정할 필요없이 psql 명령을 가장 간단한 것부터 가장 복잡한 것 까지 사용할 수 있습니다.

참고 : Linux 서버의 경우


  • 명령 내용을 파일로 저장

모델

read -r -d '' FILE_CONTENT << 'HEREDOC'
[COMMAND_CONTENT]

HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd

read -r -d '' FILE_CONTENT << 'HEREDOC'
DO $f$
declare
    curid INT := 0;
    vdata BYTEA;
    badid VARCHAR;
    loc VARCHAR;
begin
FOR badid IN SELECT some_field FROM public.some_base LOOP
    begin
    select 'ctid - '||ctid||'pagenumber - '||(ctid::text::point) [0]::bigint
        into loc
        from public.some_base where some_field = badid;
        SELECT file||' '
        INTO vdata
        FROM public.some_base where some_field = badid;
    exception
        when others then
        raise notice 'Block/PageNumber - % ',loc;
            raise notice 'Corrupted id - % ', badid;
            --return;
    end;
end loop;
end;
$f$;

HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd
  • 명령을 실행

모델

sudo -u postgres psql [some_db] -c "$(cat sqlcmd)" >>sqlop 2>&1

sudo -u postgres psql some_db -c "$(cat sqlcmd)" >>sqlop 2>&1

  • 명령 출력보기 / 추적

cat sqlop

끝난! 감사! = D


0

도커에 대한 접근

psql 명령을 통해

 docker exec -i %containerid% psql -U %user% -c '\dt' > tables.txt

또는 SQL 파일에서 쿼리

docker exec -i %containerid% psql -U %user% < file.sql > data.txt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.