[sql] Psql 출력에서 ​​결과 집합 장식을 숨기는 방법

psql의 출력에서 ​​열 이름과 행 수를 어떻게 숨기나요?

다음을 사용하여 psql을 통해 SQL 쿼리를 실행하고 있습니다.

psql --user=myuser -d mydb --output=result.txt -c "SELECT * FROM mytable;"

그리고 다음과 같은 출력을 기대하고 있습니다.

1,abc
2,def
3,xyz

그러나 대신 나는 얻는다 :

id,text
-------
1,abc
2,def
3,xyz
(3 rows)

물론, 사실 이후에 맨 위 두 행과 맨 아래 행을 필터링하는 것이 불가능하지는 않지만 psql만으로 수행하는 방법이 있습니까? 맨 페이지를 읽으면 필드 구분 기호를 제어하는 ​​옵션이 표시되지만 관련없는 출력을 숨기는 옵션은 없습니다.



답변

-t또는 --tuples-only옵션을 사용할 수 있습니다 .

psql --user = myuser -d mydb --output = result.txt -t -c "SELECT * FROM mytable;"

다음 을 추가하기 위해 편집 (1 년 이상 후) :

또한 체크 아웃 할 수 있습니다 명령을 . 더 이상 테스트하기 편리한 PostgreSQL 인스턴스가 없지만 다음 줄을 따라 작성할 수 있다고 생각합니다.COPY

psql --user = myuser -d mydb -c " 'result.txt'DELIMITER ','에 mytable 복사"

( result.txt절대 경로 여야하는 경우를 제외하고 ). 이 COPY명령은 또한보다 지능적인 CSV 형식을 지원합니다. 설명서를 참조하십시오 .


답변

psql 내에서 출력을 리디렉션하고 동일한 옵션을 사용할 수도 있습니다. \ o를 사용하여 출력 파일을 설정하고 \ t를 사용하여 튜플 만 출력합니다 (또는 \pset행 개수 “바닥 글”만 해제).

\o /home/flynn/queryout.txt
\t on
SELECT * FROM a_table;
\t off
\o

또는

\o /home/flynn/queryout.txt
\pset footer off
. . .


답변

일반적으로 psql 생성 출력을 구문 분석 하려면 -A-F

    # generate t.col1, t.col2, t.col3 ...
    while read -r c; do test -z "$c" || echo  , $table_name.$c  | \
       perl -ne 's/\n//gm;print' ; \
       done < <(cat << EOF | PGPASSWORD=${postgres_db_useradmin_pw:-} \
       psql -A -F  -v -q -t -X -w -U \
       ${postgres_db_useradmin:-} --port $postgres_db_port --host $postgres_db_host -d \
       $postgres_db_name -v table_name=${table_name:-}
    SELECT column_name
    FROM information_schema.columns
    WHERE 1=1
    AND table_schema = 'public'
    AND table_name   =:'table_name'  ;
    EOF
    )
    echo -e "\n\n"

여기 에서 전체 bash 호출의 예를 찾을 수 있습니다 .


답변