ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • postgres 데이터 파일로 저장하기
    프로그래밍/DB 2020. 10. 5. 13:22
    728x90
    반응형


    https://www.postgresql.org/docs/10/static/sql-copy.html




    postgresql 테이블의 데이터를 csv로 저장하려면 copy to 문을 사용하면 된다. 

    아래 copy 문법과 예시 참조할 것. 



    문법 ) 

    COPY table_name [ ( column_name [, ...] ) ]
        FROM { 'filename' | STDIN }
        [ [ WITH ]
              [ BINARY ]
              [ OIDS ]
              [ DELIMITER [ AS ] 'delimiter' ]
              [ NULL [ AS ] 'null string' ]
              [ CSV [ HEADER ]
                    [ QUOTE [ AS ] 'quote' ]
                    [ ESCAPE [ AS ] 'escape' ]
                    [ FORCE NOT NULL column_name [, ...] ] ] ]
    
    COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }
        TO { 'filename' | STDOUT }
        [ [ WITH ]
              [ BINARY ]
              [ OIDS ]
              [ DELIMITER [ AS ] 'delimiter' ]
              [ NULL [ AS ] 'null string' ]
              [ CSV [ HEADER ]
                    [ QUOTE [ AS ] 'quote' ]
                    [ ESCAPE [ AS ] 'escape' ]
                    [ FORCE QUOTE { column_name [, ...] | * } ] ] ]


    delimiter는 구분자를 무엇으로 할 지 지정하는 옵션이다. 


    force quote는 컬럼에서 null이 아닌 컬럼 내용을 둘러싸는 기능을 이야기 한다. 

    컬럼 이름을 설정해서 그 컬럼만 할 수 있고 *를 선택하면 전체 컬럼에 반영이 된다. 

    copy to 에서 csv format을 선택할때만 사용할 수 있는 옵션이다. 



    If * is specified, non-NULL values will be quoted in all columns. This option is allowed only in COPY TO, and only when using CSV format.



    예시 1 ) , 를 구분자로 해서 파일로 저장하는 케이스 





    COPY (

        SELECT language, title FROM cms_title WHERE language != 'en' AND title != 'Blog'

    ) TO '/path/to/csv/cms_title_dump.csv' WITH CSV HEADER DELIMITER ';';







    예시 2) 빈 문자열을 구분자로 하고 "로 칼럼을 감싸서 저장하는 케이스 




    copy (  select name, name, bldnm from table1 ,table2 where table1.id = table2.id order by namecnt desc)

    to '/home/housename.csv' with csv header DELIMITER ' ' FORCE QUOTE *;



    output 

    name,name,bldnm
    "엘지메트로시티2","엘지메트로시티2","엘지메트로시티"
    "파크리오","파크리오","파크리오"
    "성원","성원","성원아파트"
    "잠실엘스","잠실엘스","잠실엘스"



    예시 3) 중간에 다른 문자를 포함해서 저장하는 케이스 



    copy (  select name, '{', name, bldnm, '}'  from table1 ,table2 where table1.id = table2.id order by namecnt desc)

    to '/home/housename.csv' with csv header DELIMITER ' ';





    예시 4 ) 탭으로 구분자를 할 경우 





    COPY (

        SELECT language, title FROM cms_title WHERE language != 'en' AND title != 'Blog'

    ) TO '/path/to/csv/cms_title_dump.csv' WITH CSV HEADER DELIMITER E'\t';






















    728x90
    반응형

    댓글 0

Designed by Tistory.