ฉันกำลังพยายามส่งออกตาราง PostgreSQL ด้วยส่วนหัวไปยังไฟล์ CSV ผ่านทางบรรทัดคำสั่ง แต่ฉันจะส่งออกไปยังไฟล์ CSV แต่ไม่มีส่วนหัว
รหัสของฉันมีลักษณะดังนี้:
COPY products_273 to '/tmp/products_199.csv' delimiters',';
ฉันกำลังพยายามส่งออกตาราง PostgreSQL ด้วยส่วนหัวไปยังไฟล์ CSV ผ่านทางบรรทัดคำสั่ง แต่ฉันจะส่งออกไปยังไฟล์ CSV แต่ไม่มีส่วนหัว
รหัสของฉันมีลักษณะดังนี้:
COPY products_273 to '/tmp/products_199.csv' delimiters',';
คำตอบ:
COPY
ต้องใช้สิทธิ์ผู้ดูแลระบบ ใช้\COPY
แทนหากคุณพบปัญหา
COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
จากบรรทัดคำสั่ง psql:
\COPY my_table TO 'filename' CSV HEADER
ไม่มีกึ่งโคลอนในตอนท้าย
COPY
คำสั่งต้องการสิทธิ์การเข้าถึงระดับผู้ดูแลระบบ
psql
วิธีการอย่างใดอย่างหนึ่งสามารถบันทึกผลลัพธ์ได้ทุกที่ที่มีการเข้าถึง ฉันเพิ่งใช้psql
วิธีการรับข้อมูลจากเซิร์ฟเวอร์ระยะไกลเป็นไฟล์ในเครื่อง ลื่นมาก
pg_dump -h remote | pg_restore -h localhost
ใช้
psql -c "\COPY (SELECT * FROM mytable) TO STDOUT" > mytable.csv
แทนที่จะเป็นเพียงชื่อตารางคุณยังสามารถเขียนแบบสอบถามเพื่อรับข้อมูลคอลัมน์ที่เลือกเท่านั้น
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;
\COPY ...
) และอย่างน้อยในเวอร์ชัน psql ของฉัน (9.5.2) ฉันไม่จำเป็นต้องระบุ 'DELIMITER'; ค่าเริ่มต้นคือเครื่องหมายจุลภาค
เมื่อฉันไม่ได้รับอนุญาตให้เขียนไฟล์จาก Postgres ฉันพบว่าฉันสามารถเรียกใช้แบบสอบถามจากบรรทัดคำสั่ง
psql -U user -d db_name -c "Copy (Select * From foo_table LIMIT 10) To STDOUT With CSV HEADER DELIMITER ',';" > foo_data.csv
วิธีนี้ใช้ได้ผล
psql dbname -F , --no-align -c "SELECT * FROM TABLE"
-F ,
และใช้|
เป็นตัวคั่น ขอบคุณ!
COPY
ข้อความที่สร้างไฟล์ที่จะนำมาใช้ซ้ำ
สำหรับรุ่น 9.5 ฉันใช้มันจะเป็นเช่นนี้:
COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
\copy
การแก้ปัญหานี้ทำงานให้ฉันใช้
psql -h <host> -U <user> -d <dbname> -c "\copy <table_name> FROM '<path to csvfile/file.csv>' with (format csv,header true, delimiter ',');"
นี่เป็นวิธีที่ฉันทำให้มันทำงานได้โดยใช้ 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' เป็นตัวคั่นดังนั้นฉันจึงใช้~เพราะอักขระที่ไม่ค่อยได้ใช้
คัดลอก (anysql แบบสอบถาม datawanttoexport) ไปที่ 'fileablsoutepathwihname' delimiter ',' csv header;
การใช้ u นี้สามารถส่งออกข้อมูลได้
ฉันกำลังโพสต์คำตอบนี้เพราะไม่มีคำตอบอื่นที่ให้ไว้ที่นี่ใช้ได้จริงสำหรับฉัน ฉันไม่สามารถใช้COPY
จากภายใน Postgres ได้เนื่องจากฉันไม่มีสิทธิ์ที่ถูกต้อง ดังนั้นฉันเลือก "ส่งออกแถวกริด" และบันทึกผลลัพธ์เป็น UTF-8
psql
รุ่นที่กำหนดโดย @ Brian ยังไม่ได้ทำงานให้ฉันด้วยเหตุผลที่แตกต่างกัน เหตุผลที่มันใช้งานไม่ได้นั่นคือพรอมต์คำสั่งของ Windows (ฉันใช้ Windows) กำลังยุ่งอยู่กับการเข้ารหัสของมันเอง ฉันยังคงได้รับข้อผิดพลาดนี้:
ข้อผิดพลาด: ตัวอักษรที่มีลำดับไบต์ 0x81 ในการเข้ารหัส "WIN1252" ไม่มีความเทียบเท่าในการเข้ารหัส "UTF8"
วิธีแก้ปัญหาที่ฉันใช้คือเขียนสคริปต์ JDBC สั้น ๆ (Java) ซึ่งอ่านไฟล์ CSV และออกคำสั่งแทรกลงในตาราง Postgres ของฉันโดยตรง ใช้งานได้ แต่พรอมต์คำสั่งจะทำงานได้หากไม่ได้เปลี่ยนการเข้ารหัส
ลองทำสิ่งนี้: "COPY products_273 FROM '\ tmp \ products_199.csv' DELIMITER ',' CSV HEADER"