Bagaimana cara mengekspor tabel sebagai CSV dengan judul di Postgresql?

418

Saya mencoba untuk mengekspor tabel PostgreSQL dengan judul ke file CSV melalui baris perintah, namun saya mendapatkannya untuk mengekspor ke file CSV, tetapi tanpa judul.

Kode saya terlihat sebagai berikut:

COPY products_273 to '/tmp/products_199.csv' delimiters',';
Elitmiar
sumber
Apakah Anda menggunakan postgres> = 8.1?
Dana the Sane
1
Saya pikir saya akan membuat rencana untuk upgrad ke versi yang lebih baru, akan membuat hidup jadi lebih mudah
Elitmiar
1
Lihat juga stackoverflow.com/q/1517635/287948
Peter Krauss

Jawaban:

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

seperti yang dijelaskan dalam manual .

Milen A. Radev
sumber
7
Ketahuilah bahwa argumen HEADER tidak diperkenalkan sampai 8.1.
Dana the Sane
7
Katakanlah, yang agak berkarat.
Milen A. Radev
65
Catatan COPYmembutuhkan hak administrator. Gunakan \COPYsebagai gantinya jika Anda mengalami masalah.
fny
5
ini dapat memberikan Anda output yang tidak sesuai, lebih baik menggunakan "FORMAT csv" daripada "DELIMITER ','". tidak yakin versi apa yang tiba
grahamrhay
37
Untuk v9.5, perintahnya sekarangCOPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
Shubham Goyal
223

Dari baris perintah psql:

\COPY my_table TO 'filename' CSV HEADER

tidak ada titik koma di akhir.

Laurent Debricon
sumber
22
versi ini sejauh ini merupakan yang terbaik karena COPYperintah ini memerlukan akses admin
Matthew O'Riordan
2
Juga dengan psqlpendekatan ini, seseorang dapat menyimpan output di mana pun seseorang memiliki akses. Saya hanya menggunakan psqlpendekatan untuk mendapatkan data dari server jauh ke file lokal. Sangat licin.
Ian Gow
Jauh lebih baik, terutama ketika menyimpan ke direktori di mana Anda memiliki akses tetapi pengguna postgres tidak.
Steve Bennett
2
@arilwan Pakai 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
122

alih-alih hanya nama tabel, Anda juga dapat menulis kueri untuk mendapatkan hanya data kolom yang dipilih.

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

dengan hak istimewa admin

\COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;
Dhruvil Thaker
sumber
Saya tidak percaya Anda perlu mengakhiri koma di versi psql dari perintah ( \COPY ...). Dan setidaknya dalam versi psql saya (9.5.2) saya tidak perlu menentukan 'DELIMITER'; standarnya adalah koma.
user1071847
bagaimana sintaks berubah jika saya menyalin dari CSV ke tabel untuk bidang yang dipilih
user269867
99

Ketika saya tidak memiliki izin untuk menulis file dari Postgres saya menemukan bahwa saya dapat menjalankan query dari baris perintah.

psql -U user -d db_name -c "Copy (Select * From foo_table LIMIT 10) To STDOUT With CSV HEADER DELIMITER ',';" > foo_data.csv
Brian
sumber
7
Yang terbaik untuk "lingkungan apa pun". Terbaik untuk 1. Tidak perlu izin khusus di Postgresql atau di klien; 2. dapat menggunakan jalur relatif; dan 3. aman untuk format CSV nyata (kutipan aman).
Peter Krauss
34

Ini bekerja

psql dbname -F , --no-align -c "SELECT * FROM TABLE"
jordg
sumber
10
Bagus. Perhatikan bahwa ini tampaknya tidak keluar dari koma di dalam bidang yang memuatnya.
RecursivelyIronic
Saya suka ini, tanpa -F ,, dan gunakan |sebagai pemisah. Terima kasih!
dsummersl
2
Ini bukan apa yang biasanya dianggap sebagai fitur Ekspor, hanya tampilan data yang dikendalikan. Perbedaannya ringan, tetapi penting: ini lebih dimaksudkan untuk dibaca oleh manusia daripada COPYpernyataan yang membuat file untuk digunakan kembali
Romain G
7
BAHAYA itu bukan untuk format CSV, tidak berfungsi untuk array atau teks dengan "," .. tidak melakukan kutipan CSV yang tepat. Gunakan jawaban @ Brian.
Peter Krauss
8

Untuk versi 9.5 yang saya gunakan, akan seperti ini:

COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
maytham-ɯɐɥʇʎɐɯ
sumber
7

Solusi ini berfungsi untuk saya gunakan \copy.

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

Cara paling sederhana (menggunakan psql) tampaknya dengan menggunakan --csvflag:

psql --csv -c "SELECT * FROM products_273" > '/tmp/products_199.csv'
Yan Foto
sumber
Itu hanya berfungsi di PostgreSQL versi 12+
Dirk
3

Inilah cara saya membuatnya bekerja dengan menggunakan pgsl menghubungkan ke database Heroku PG:

Saya harus terlebih dahulu mengubah pengkodean klien ke utf8 seperti ini: \encoding UTF8

Kemudian membuang data ke file CSV ini:

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

Saya menggunakan ~ sebagai pembatas karena saya tidak suka file CSV, saya biasanya menggunakan file TSV, tapi itu tidak akan membiarkan saya menambahkan '\ t' sebagai pembatas, jadi saya menggunakan ~ karena ini adalah karakter yang jarang digunakan.

Kuda O'Houlihan
sumber
0

salin (anysql query datawanttoexport) ke 'fileablsoutepathwihname' delimiter ',' header csv;

Dengan ini Anda dapat mengekspor data juga.

pengguna3767321
sumber
0

Saya memposting jawaban ini karena tidak ada jawaban lain yang diberikan di sini yang berfungsi untuk saya. Saya tidak bisa menggunakanCOPY dari dalam Postgres, karena saya tidak memiliki izin yang benar. Jadi saya memilih "Ekspor baris jaringan" dan menyimpan hasilnya sebagai UTF-8.

The psqlversi yang diberikan oleh @ Brian juga tidak bekerja untuk saya, untuk alasan yang berbeda. Alasan tidak bekerja adalah karena ternyata command prompt Windows (saya menggunakan Windows) ikut campur dengan pengkodean sendiri. Saya terus mendapatkan kesalahan ini:

GALAT: karakter dengan urutan byte 0x81 dalam penyandian "WIN1252" tidak memiliki padanan dalam penyandian "UTF8"

Solusi yang akhirnya saya gunakan adalah menulis skrip JDBC pendek (Java) yang membaca file CSV dan mengeluarkan pernyataan insert langsung ke tabel Postgres saya. Ini berhasil, tetapi command prompt juga akan berhasil seandainya tidak mengubah pengkodean.

Tim Biegeleisen
sumber
0

Coba ini: "COPY products_273 DARI '\ tmp \ products_199.csv' DELIMITER ',' CSV HEADER"

Mohit Singh
sumber