How do you print the result of a PostgreSQL query in CSV or TSV format from the command line?

后端 未结 8 1618
庸人自扰
庸人自扰 2021-01-30 20:05

I\'d like to execute a query from the shell (not in the interactive psql client) and have it print the CSV or TSV representation of the output to STDOUT. How do you do that with

相关标签:
8条回答
  • 2021-01-30 20:21

    Export AS TSV WITH HEADER

    You can include the HEADER as follows:

    \COPY (SELECT * FROM tca) TO '/.../metab/tca.tsv' WITH DELIMITER E'\t' CSV HEADER;
    
    \COPY (SELECT * FROM tca) TO '/...a/metab/tca.tsv' WITH NULL AS '' DELIMITER E'\t' CSV HEADER;
    

    E.g. (PSQL):

    [metabolism]# \COPY (SELECT * FROM tca) TO '/mnt/Vancouver/programming/data/metabolism/tca.tsv' WITH NULL AS '' DELIMITER E'\t' CSV HEADER;
    COPY 22
    

    BASH:

    [victoria@victoria tsv]$ pwd
    /mnt/Vancouver/programming/data/metabolism/tsv
    
    [victoria@victoria tsv]$ head -n3 tca.tsv
    uuid    src tgt rel rel_type
    878b87de-0ca8-49a8-9f77-a24353e251d2    oxalosuccinic acid  oxoglutaric acid    1.1.1.42    2
    7fd9cf88-495b-491b-956e-294f19097923    isocitric acid  oxoglutaric acid    1.1.1.41    2
    [victoria@victoria csv]$ 
    
    0 讨论(0)
  • 2021-01-30 20:22

    To specify a tsv use the delimiter '\t'

    psql my_database -U myuser -F'\t' --no-align -f mysqlfile.sql -o outputfile.tsv
    

    To specify a csv use the delimiter ','

    psql my_database -U myuser -F',' --no-align -f mysqlfile.sql -o outputfile.csv
    
    0 讨论(0)
  • 2021-01-30 20:23

    Starting from Bohemian's answer, I found these flags useful:

    psql my_database -U myuser -A -F , -X -t -f /path/to/query.sql -o /path/to/output.csv
    
    • Unaligned output mode: -A
    • Use comma as field delimiter: -F ,
    • Do not read psqlrc: -X
    • Tuples only (no header/footer): -t
    • File containing SQL query: -f
    • Output file: -o
    0 讨论(0)
  • 2021-01-30 20:23

    Also possible is the copy command which allows you to specify header, delimiters and quoting options

    psql my_database -U my_user -c "copy (select a.id,b.id from my_table_a as a inner join my_table_b as b on b.id = a.id) to STDOUT"
    
    0 讨论(0)
  • 2021-01-30 20:28

    If you are using PostgreSQL 8.2 or newer, use this for CSV:

    psql -c "COPY (<select query>) TO STDOUT WITH CSV"
    

    and this of TSV, with proper NULLs:

    psql -c "COPY (<select query>) TO STDOUT WITH NULL AS ''"
    

    The CSV form will properly quote any fields that contain the double-quote character. See the PostgreSQL documentation of your specific version for more details and options for COPY.

    0 讨论(0)
  • 2021-01-30 20:28

    The simplest way (using psql) seems to be by using --csv flag:

    psql --csv -c "SELECT * FROM sometable"
    
    0 讨论(0)
提交回复
热议问题