ส่งออกตาราง Postgres ระยะไกลไปยังไฟล์ CSV บนเครื่องท้องถิ่น


15

ฉันเข้าถึงฐานข้อมูลบนเซิร์ฟเวอร์ระยะไกลแบบอ่านอย่างเดียว ดังนั้นฉันสามารถรัน:

COPY products TO '/tmp/products.csv' DELIMITER ',';

แต่บนเซิร์ฟเวอร์นั้นฉันไม่มีสิทธิ์สร้าง / บันทึกไฟล์ดังนั้นฉันต้องทำสิ่งนี้กับเครื่องของฉัน

เมื่อฉันเชื่อมต่อกับฐานข้อมูลระยะไกลฉันจะรันคำสั่งเพื่อบันทึกไฟล์บนเครื่องท้องถิ่นของฉันแทนที่จะเป็นเซิร์ฟเวอร์ระยะไกลได้อย่างไร

หรือฉันจะรันคำสั่ง Linux เพื่อเชื่อมต่อกับฐานข้อมูลระยะไกลดำเนินการค้นหาและบันทึกผลลัพธ์เป็นไฟล์ไปยังเครื่องท้องถิ่นของฉันได้อย่างไร

คำตอบ:


29

ทั้งแนวทางที่แนะนำไปแล้วดูเหมือนจะซับซ้อนโดยไม่จำเป็น

เพียงใช้คำสั่งpsqlในตัว\copyซึ่งทำงานเหมือนฝั่งเซิร์ฟเวอร์COPYแต่ทำสำเนาผ่านโปรโตคอล wire ไปยังไคลเอนต์และใช้เส้นทางไคลเอนต์

เพราะมันเป็นpsqlคำสั่ง backslash คุณไม่ต้องใช้เครื่องหมายอัฒภาคต่อท้ายเช่น:

\copy products TO '/tmp/products.csv' CSV DELIMITER ','

ดูรายการในคู่มือสำหรับคำสั่งและเอกสารประกอบคำสั่งเพื่อดูรายละเอียดเพิ่มเติม\copypsqlCOPY

เช่นเดียวกับที่COPYคุณสามารถใช้\copyกับ(SELECT ...)แบบสอบถามแทนชื่อตารางเมื่อคัดลอกข้อมูลออก (แต่ไม่ใช่ใน)


ทางเลือกที่ต่ำกว่าโดยทั่วไปที่สามารถเป็นประโยชน์ในสถานการณ์ที่ จำกัด ไม่กี่คือการใช้:

psql -t -P format=unaligned -P fieldsep_zero=on -c 'SELECT * FROM tablename'

และใช้การ-oเปลี่ยนทิศทางแฟล็กหรือเชลล์เอาต์พุตเพื่อเขียนเอาต์พุตไปยังไฟล์ คุณควรใช้\copyสิ่งนี้เป็นประจำ


แต่สิ่งนี้ไม่อนุญาตสำหรับการทำธุรกรรม :(
Reza S

อืมแน่นอน ใช้ที่นี่เอกสารที่จะเลี้ยงpsqlสคริปต์เริ่มต้นด้วยBEGINแล้วคุณทำคำสั่งแล้ว\copy COMMITหรือใช้psql -fเพื่อเรียกใช้สคริปต์แทนที่จะใช้ที่นี่เอกสาร
Craig Ringer

ขอบคุณที่กลับมาอีกครั้ง ... นั่นคือสิ่งที่ฉันทำลงไปและมันก็ใช้ได้ =)
Reza S

คุณสามารถใช้-Aแทน-P format=unalignedและฉันคิดว่าคุณต้องการ-P fieldsep=,
Evan Carroll

2

คำสั่ง Linux คือ:

psql -h 127.0.0.1 -U username -o file.csv -c 'select id, name from clients;'

1
นั่นจะไม่สร้าง CSV มันจะสร้างผลลัพธ์ข้อความที่จัดรูปแบบ หากคุณเพิ่มเข้าไป-t -P format=unaligned ในคำสั่งนั้นคุณจะได้ใกล้ชิดขึ้นเล็กน้อยเช่น buggy pipe-delimited CSV แต่ไพพ์ในข้อความจะไม่ถูกหลบหนีดังนั้นมันจะไม่ถูกต้อง
Craig Ringer

โอ้คุณอาจต้องการ-P fieldsep=','ยกเว้นว่าสิ่งนี้จะทำให้เกิดข้อผิดพลาดมากขึ้นเนื่องจากไม่มีการหลบหนี -P fieldsep_zero=onจะโอเคถ้าคุณไม่แยกวิเคราะห์ข้อความ null-byte-delimited เนื่องจาก null null ไม่สามารถเกิดขึ้นได้ในpsqlเอาต์พุต
Craig Ringer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.