วิธีการส่งออกตารางเป็น CSV โดยมีหัวเรื่องใน Postgresql


418

ฉันกำลังพยายามส่งออกตาราง PostgreSQL ด้วยส่วนหัวไปยังไฟล์ CSV ผ่านทางบรรทัดคำสั่ง แต่ฉันจะส่งออกไปยังไฟล์ CSV แต่ไม่มีส่วนหัว

รหัสของฉันมีลักษณะดังนี้:

COPY products_273 to '/tmp/products_199.csv' delimiters',';

คุณใช้ postgres> = 8.1 หรือไม่
Dana the Sane

1
ฉันคิดว่าฉันจะทำให้แผนการที่จะ upgrad การรุ่นใหม่จะทำให้ชีวิตง่ายขึ้นมาก
Elitmiar

คำตอบ:


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

ที่อธิบายไว้ในคู่มือ


7
โปรดทราบว่าอาร์กิวเมนต์ HEADER ไม่ได้ถูกนำมาใช้จนถึง 8.1
Dana the Sane

7
ซึ่งก็คือว่าสนิมเล็กน้อย
Milen A. Radev

65
หมายเหตุCOPYต้องใช้สิทธิ์ผู้ดูแลระบบ ใช้\COPYแทนหากคุณพบปัญหา
fny

5
สิ่งนี้สามารถให้ผลลัพธ์ที่ไม่เป็นไปตามข้อกำหนดได้ดีกว่าให้ใช้ "FORMAT csv" มากกว่า "DELIMITER ','" ไม่แน่ใจว่ารุ่นที่เข้ามาแม้ว่า
grahamrhay

37
สำหรับ v9.5 คำสั่งคือตอนนี้COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
Shubham Goyal

223

จากบรรทัดคำสั่ง psql:

\COPY my_table TO 'filename' CSV HEADER

ไม่มีกึ่งโคลอนในตอนท้าย


22
รุ่นนี้ดีที่สุดเท่าที่COPYคำสั่งต้องการสิทธิ์การเข้าถึงระดับผู้ดูแลระบบ
Matthew O'Riordan

2
ด้วยpsqlวิธีการอย่างใดอย่างหนึ่งสามารถบันทึกผลลัพธ์ได้ทุกที่ที่มีการเข้าถึง ฉันเพิ่งใช้psqlวิธีการรับข้อมูลจากเซิร์ฟเวอร์ระยะไกลเป็นไฟล์ในเครื่อง ลื่นมาก
Ian Gow

ดีขึ้นมากโดยเฉพาะเมื่อบันทึกไปยังไดเรกทอรีที่คุณมีการเข้าถึง แต่ผู้ใช้ postgres ไม่ได้
Steve Bennett

2
@arilwan 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

แทนที่จะเป็นเพียงชื่อตารางคุณยังสามารถเขียนแบบสอบถามเพื่อรับข้อมูลคอลัมน์ที่เลือกเท่านั้น

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

ด้วยสิทธิ์ของผู้ดูแลระบบ

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

ฉันไม่เชื่อว่าคุณต้องการเครื่องหมายอัฒภาคในคำสั่ง psql เวอร์ชัน ( \COPY ...) และอย่างน้อยในเวอร์ชัน psql ของฉัน (9.5.2) ฉันไม่จำเป็นต้องระบุ 'DELIMITER'; ค่าเริ่มต้นคือเครื่องหมายจุลภาค
user1071847

วิธีการที่ไวยากรณ์เปลี่ยนถ้าฉันกำลังคัดลอกจาก CSV ไปยังตารางสำหรับเขตข้อมูลที่เลือก
269867

99

เมื่อฉันไม่ได้รับอนุญาตให้เขียนไฟล์จาก Postgres ฉันพบว่าฉันสามารถเรียกใช้แบบสอบถามจากบรรทัดคำสั่ง

psql -U user -d db_name -c "Copy (Select * From foo_table LIMIT 10) To STDOUT With CSV HEADER DELIMITER ',';" > foo_data.csv

7
ดีที่สุดสำหรับ "สภาพแวดล้อมใด ๆ " ดีที่สุดสำหรับ1.ไม่ต้องการสิทธิ์พิเศษที่ Postgresql หรือที่ลูกค้า 2.สามารถใช้เส้นทางสัมพัทธ์ และ3.ปลอดภัยสำหรับรูปแบบ CSV จริง (ใบเสนอราคาที่ปลอดภัย)
Peter Krauss

34

วิธีนี้ใช้ได้ผล

psql dbname -F , --no-align -c "SELECT * FROM TABLE"

10
ดี โปรดทราบว่าสิ่งนี้ดูเหมือนว่าจะไม่ใช้เครื่องหมายจุลภาคในฟิลด์ที่มีอยู่
แบบเรียกซ้ำประจำ

ฉันชอบสิ่งนี้โดยไม่มี-F ,และใช้|เป็นตัวคั่น ขอบคุณ!
dsummersl

2
นี่ไม่ใช่สิ่งที่โดยทั่วไปถือว่าเป็นคุณสมบัติส่งออกเพียงแสดงข้อมูลที่ควบคุม ความแตกต่างคือความสว่าง แต่สำคัญ: สิ่งนี้มีวัตถุประสงค์เพื่อให้มนุษย์อ่านมากกว่าCOPYข้อความที่สร้างไฟล์ที่จะนำมาใช้ซ้ำ
Romain G

7
เป็นอันตรายไม่ได้อยู่ในรูปแบบ CSV ไม่สามารถใช้กับอาร์เรย์หรือข้อความด้วย "," .. ไม่ได้ทำใบเสนอราคา CSV ที่เหมาะสม ใช้คำตอบของ @ Brian
Peter Krauss


7

\copyการแก้ปัญหานี้ทำงานให้ฉันใช้

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

4

วิธีที่ง่ายที่สุด (โดยใช้psql) ดูเหมือนว่าเป็นโดยใช้--csvค่าสถานะ:

psql --csv -c "SELECT * FROM products_273" > '/tmp/products_199.csv'

ใช้งานได้เฉพาะใน PostgreSQL เวอร์ชัน 12+
Dirk

3

นี่เป็นวิธีที่ฉันทำให้มันทำงานได้โดยใช้ pgsl เชื่อมต่อกับฐานข้อมูล Heroku PG:

ฉันต้องเปลี่ยนการเข้ารหัสไคลเอ็นต์เป็น utf8 เช่นนี้ก่อน: \encoding UTF8

จากนั้นทิ้งข้อมูลลงในไฟล์ CSV สิ่งนี้:

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

ฉันใช้ ~ เป็นตัวคั่นเพราะฉันไม่ชอบไฟล์ CSV ฉันมักจะใช้ไฟล์ TSV แต่จะไม่ให้ฉันเพิ่ม '\ t' เป็นตัวคั่นดังนั้นฉันจึงใช้~เพราะอักขระที่ไม่ค่อยได้ใช้


0

คัดลอก (anysql แบบสอบถาม datawanttoexport) ไปที่ 'fileablsoutepathwihname' delimiter ',' csv header;

การใช้ u นี้สามารถส่งออกข้อมูลได้


0

ฉันกำลังโพสต์คำตอบนี้เพราะไม่มีคำตอบอื่นที่ให้ไว้ที่นี่ใช้ได้จริงสำหรับฉัน ฉันไม่สามารถใช้COPYจากภายใน Postgres ได้เนื่องจากฉันไม่มีสิทธิ์ที่ถูกต้อง ดังนั้นฉันเลือก "ส่งออกแถวกริด" และบันทึกผลลัพธ์เป็น UTF-8

psqlรุ่นที่กำหนดโดย @ Brian ยังไม่ได้ทำงานให้ฉันด้วยเหตุผลที่แตกต่างกัน เหตุผลที่มันใช้งานไม่ได้นั่นคือพรอมต์คำสั่งของ Windows (ฉันใช้ Windows) กำลังยุ่งอยู่กับการเข้ารหัสของมันเอง ฉันยังคงได้รับข้อผิดพลาดนี้:

ข้อผิดพลาด: ตัวอักษรที่มีลำดับไบต์ 0x81 ในการเข้ารหัส "WIN1252" ไม่มีความเทียบเท่าในการเข้ารหัส "UTF8"

วิธีแก้ปัญหาที่ฉันใช้คือเขียนสคริปต์ JDBC สั้น ๆ (Java) ซึ่งอ่านไฟล์ CSV และออกคำสั่งแทรกลงในตาราง Postgres ของฉันโดยตรง ใช้งานได้ แต่พรอมต์คำสั่งจะทำงานได้หากไม่ได้เปลี่ยนการเข้ารหัส


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.