บันทึกเอาต์พุต PL / pgSQL จาก PostgreSQL เป็นไฟล์ CSV


910

วิธีที่ง่ายที่สุดในการบันทึกเอาต์พุต PL / pgSQL จากฐานข้อมูล PostgreSQL เป็นไฟล์ CSV คืออะไร?

ฉันใช้ PostgreSQL 8.4 กับ pgAdmin III และปลั๊กอิน PSQL ที่ฉันเรียกใช้แบบสอบถาม


1
ดูเพิ่มเติมที่stackoverflow.com/q/1120109/287948
Peter Krauss

คำตอบ:


1367

คุณต้องการไฟล์ผลลัพธ์บนเซิร์ฟเวอร์หรือบนไคลเอนต์หรือไม่?

ฝั่งเซิร์ฟเวอร์

หากคุณต้องการบางสิ่งที่ง่ายต่อการใช้ซ้ำหรือทำให้เป็นอัตโนมัติคุณสามารถใช้คำสั่งCOPY ที่สร้างขึ้นใน Postgresql เช่น

Copy (Select * From foo) To '/tmp/test.csv' With CSV DELIMITER ',' HEADER;

วิธีการนี้ทำงานบนเซิร์ฟเวอร์ระยะไกลทั้งหมด - ไม่สามารถเขียนลงในเครื่องคอมพิวเตอร์ของคุณได้ นอกจากนี้ยังต้องมีการเรียกใช้เป็น "superuser" ของ Postgres (ปกติเรียกว่า "root") เนื่องจาก Postgres ไม่สามารถหยุดสิ่งที่น่ารังเกียจด้วยระบบไฟล์ภายในเครื่องของเครื่องนั้นได้

แต่นั่นไม่ได้หมายความว่าคุณจริงจะต้องมีการเชื่อมต่อเป็น superuser (อัตโนมัติที่จะเสี่ยงต่อความปลอดภัยของชนิดที่แตกต่างกัน) เพราะคุณสามารถใช้ตัวเลือกในการที่จะทำให้ฟังก์ชั่นที่ทำงานราวกับว่าคุณเป็น superuserSECURITY DEFINERCREATE FUNCTION

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

  1. ซึ่งไฟล์ควรผู้ใช้จะได้รับอนุญาตในการอ่าน / เขียนบนดิสก์? นี่อาจเป็นไดเรกทอรีเฉพาะตัวอย่างเช่นและชื่อไฟล์อาจต้องมีคำนำหน้าหรือส่วนขยายที่เหมาะสม
  2. ซึ่งตารางผู้ใช้ควรจะสามารถอ่าน / เขียนในฐานข้อมูลหรือไม่ โดยปกติจะถูกกำหนดโดยGRANTs ในฐานข้อมูล แต่ตอนนี้ฟังก์ชั่นกำลังทำงานเป็น superuser ดังนั้นตารางที่ปกติจะ "เกินขอบเขต" จะสามารถเข้าถึงได้อย่างเต็มที่ คุณอาจไม่ต้องการให้ใครบางคนเรียกใช้ฟังก์ชันของคุณและเพิ่มแถวที่ส่วนท้ายของตาราง "ผู้ใช้" ของคุณ ...

ฉันได้เขียนโพสต์บล็อกที่ขยายในวิธีนี้รวมถึงตัวอย่างของฟังก์ชั่นที่ส่งออก (หรือนำเข้า) ไฟล์และตารางตามเงื่อนไขที่เข้มงวด


ด้านลูกค้า

อีกวิธีคือทำการจัดการไฟล์ในฝั่งไคลเอ็นต์เช่นในแอปพลิเคชันหรือสคริปต์ของคุณ เซิร์ฟเวอร์ Postgres ไม่จำเป็นต้องรู้ว่าไฟล์ใดที่คุณกำลังคัดลอกมันแค่กระจายข้อมูลและไคลเอนต์วางไว้ที่อื่น

ไวยากรณ์พื้นฐานสำหรับสิ่งนี้คือCOPY TO STDOUTคำสั่งและเครื่องมือกราฟิกเช่น pgAdmin จะล้อมรอบคุณไว้ในกล่องโต้ตอบที่ดี

psqlลูกค้าบรรทัดคำสั่งที่มีความพิเศษ "เมตา" คำสั่งที่เรียกว่า\copyซึ่งจะมีตัวเลือกทั้งหมดเช่นเดียวกับ "ของจริง" COPYแต่จะดำเนินการภายในไคลเอนต์:

\copy (Select * From foo) To '/tmp/test.csv' With CSV

โปรดทราบว่าไม่มีการยกเลิก;เนื่องจากคำสั่ง meta ถูกยกเลิกโดยบรรทัดใหม่ซึ่งแตกต่างจากคำสั่ง SQL

จากเอกสาร :

อย่าสับสน COPY กับคำสั่ง psql \ copy \ copy เรียกใช้คัดลอกจาก STDIN หรือคัดลอกไปยัง STDOUT แล้วดึง / จัดเก็บข้อมูลในไฟล์ที่เข้าถึงได้โดยไคลเอนต์ psql ดังนั้นความสามารถในการเข้าถึงไฟล์และสิทธิ์การเข้าถึงจึงขึ้นอยู่กับไคลเอ็นต์มากกว่าเซิร์ฟเวอร์เมื่อใช้ \ copy

ภาษาโปรแกรมแอปพลิเคชันของคุณอาจรองรับการดึงหรือดึงข้อมูล แต่โดยทั่วไปคุณไม่สามารถใช้COPY FROM STDIN/ TO STDOUTภายในคำสั่ง SQL มาตรฐานได้เนื่องจากไม่มีวิธีการเชื่อมต่ออินพุต / เอาต์พุตสตรีม ตัวจัดการ PostgreSQL ของ PHP ( ไม่ใช่ PDO) รวมถึงพื้นฐานpg_copy_fromและpg_copy_toฟังก์ชันที่คัดลอกไปยัง / จากอาร์เรย์ PHP ซึ่งอาจไม่มีประสิทธิภาพสำหรับชุดข้อมูลขนาดใหญ่


131
ตัวอย่างข้างต้นเห็นได้ชัดว่าบางครั้งผู้ใช้จำเป็นต้องเป็น superuser ต่อไปนี้เป็นรุ่นสำหรับคนทั่วไป;) echo“ COPY (SELECT * จาก foo) ถึง STDOUT ด้วย CSV HEADER” | psql -o '/tmp/test.csv' database_name
Drachenfels

10
@Drachenfels: \copyทำงานเหมือนกัน - นั่นคือพา ธ นั้นสัมพันธ์กับลูกค้าและไม่จำเป็น / อนุญาตใช้เครื่องหมายอัฒภาค ดูการแก้ไขของฉัน
krlmlr

3
@IMSoP: คุณจะเพิ่มคำสั่ง COPY ในฟังก์ชั่น sql (บน postgres 9.3) ได้อย่างไร? ดังนั้นแบบสอบถามจะถูกบันทึกลงในไฟล์. csv หรือไม่
jO

12
ดูเหมือนว่า\copyจะต้องเป็นหนึ่งซับ ดังนั้นคุณจะไม่ได้รับความสวยงามในการจัดรูปแบบ sql ตามที่คุณต้องการและเพียงแค่ใส่สำเนา / ฟังก์ชันรอบ ๆ
isaaclw

1
@AndreSilva ในฐานะที่เป็นคำตอบของรัฐที่\copyเป็นพิเศษ meta-คำสั่งในpsqlลูกค้าบรรทัดคำสั่ง มันจะไม่ทำงานในลูกค้ารายอื่นเช่น pgAdmin; พวกเขาอาจจะมีเครื่องมือของตัวเองเช่นพ่อมดกราฟิกเพื่อทำงานนี้
IMSoP

519

มีหลายวิธี:

1 psqlคำสั่ง

psql -d dbname -t -A -F"," -c "select * from users" > output.csv

นี่เป็นข้อได้เปรียบที่ยิ่งใหญ่ที่คุณสามารถใช้ได้ผ่าน SSH เช่นssh postgres@host command- ช่วยให้คุณได้รับ

2 copyคำสั่งpostgres

COPY (SELECT * from users) To '/tmp/output.csv' With CSV;

3 psql แบบโต้ตอบ (หรือไม่)

>psql dbname
psql>\f ','
psql>\a
psql>\o '/tmp/output.csv'
psql>SELECT * from users;
psql>\q

พวกเขาทั้งหมดสามารถใช้ในสคริปต์ แต่ฉันชอบ # 1

4 pgadmin แต่นั่นไม่ใช่สคริปต์


32
IMHO ตัวเลือกแรกนั้นเกิดข้อผิดพลาดได้ง่ายเนื่องจากไม่มีการยกเว้นเครื่องหมายจุลภาคในการส่งออกข้อมูลที่เหมาะสม
Piohen

4
นอกจากนี้ psql ไม่ได้อ้างอิงค่าของเซลล์ดังนั้นหากข้อมูลใด ๆของคุณใช้ตัวคั่นไฟล์ของคุณจะเสียหาย
Cerin

7
@Cerin -t เป็นคำพ้องสำหรับ --tuples-only (ปิดการพิมพ์ชื่อคอลัมน์และส่วนท้ายของจำนวนแถวผลลัพธ์) - ละเว้นเพื่อรับส่วนหัวคอลัมน์
ic3b3rg

21
เพิ่งทดสอบการอ้างสิทธิ์โดยใช้เครื่องหมายจุลภาค - เป็นจริงวิธีที่ # 1 ไม่ได้ใช้เครื่องหมายจุลภาคในค่า
MrColes

1
ใช้ "\ pset footer" เพื่อให้จำนวนแถวไม่เพิ่มขึ้นในไฟล์
techbrownbags

94

ในเทอร์มินัล (ในขณะที่เชื่อมต่อกับ db) ให้ตั้งค่าเอาต์พุตเป็นไฟล์ cvs

1) ตั้งค่าฟิลด์ seperator เป็น',':

\f ','

2) กำหนดรูปแบบผลลัพธ์ที่ไม่ได้จัดแนว:

\a

3) แสดงสิ่งอันดับเท่านั้น:

\t

4) ตั้งค่าเอาต์พุต:

\o '/tmp/yourOutputFile.csv'

5) ดำเนินการค้นหาของคุณ:

:select * from YOUR_TABLE

6) เอาท์พุท:

\o

จากนั้นคุณจะสามารถค้นหาไฟล์ csv ของคุณในตำแหน่งนี้:

cd /tmp

คัดลอกโดยใช้scpคำสั่งหรือแก้ไขโดยใช้นาโน:

nano /tmp/yourOutputFile.csv

4
และ \ o เพื่อพิมพ์คอนโซลอีกครั้ง
metdos

2
สิ่งนี้จะไม่สร้างไฟล์ CSV แต่จะบันทึกเอาต์พุตของคำสั่งไปยังไฟล์ข้อความ (ซึ่งไม่ได้คั่นด้วยเครื่องหมายจุลภาค)
Ruslan Kabalin

@RuslanKabalin ใช่ฉันได้เพียงแค่ว่า notticed และแก้ไขเพิ่มเติมการเรียนการสอนเพื่อสร้างคั่นด้วยเครื่องหมายจุลภาคเอาต์พุต (CVS)
Marcin Wasiluk

5
ฉันจะปรับปรุงคำตอบนี้โดยการสังเกตว่าเอาต์พุต "csv" จะไม่สามารถหลบหนีได้อย่างถูกต้องและทุกครั้งที่คำสั่ง sql ถูกประมวลผลผลลัพธ์จะถูกรวมเข้ากับไฟล์เอาต์พุต
Danny Armstrong

สิ่งที่เกี่ยวกับการขึ้นบรรทัดใหม่ในค่าของเขตข้อมูล COPYหรือ\copyวิธีการจัดการอย่างถูกต้อง (แปลงรูปแบบ CSV มาตรฐาน); ทำสิ่งนี้?
สัญลักษณ์แทน

37

หากคุณสนใจในคอลัมน์ทั้งหมดของตารางโดยเฉพาะพร้อมกับส่วนหัวคุณสามารถใช้

COPY table TO '/some_destdir/mycsv.csv' WITH CSV HEADER;

มันง่ายกว่านิดหน่อย

COPY (SELECT * FROM table) TO '/some_destdir/mycsv.csv' WITH CSV HEADER;

ซึ่งเท่าที่ความรู้ของฉันจะเท่ากัน


1
หากแบบสอบถามเป็นแบบกำหนดเอง (IE มีชื่อแทนคอลัมน์หรือเข้าร่วมตารางที่แตกต่างกัน) ส่วนหัวจะพิมพ์ชื่อแทนคอลัมน์เช่นเดียวกับที่แสดงบนหน้าจอ
Devy

33

การรวมการส่งออก CSV

ข้อมูลนี้ไม่ได้เป็นตัวแทนที่ดีจริงๆ เนื่องจากนี่เป็นครั้งที่สองที่ฉันจำเป็นต้องได้รับสิ่งนี้ฉันจะวางสิ่งนี้ไว้ที่นี่เพื่อเตือนตัวเองหากไม่มีอะไรอื่น

จริงๆวิธีที่ดีที่สุดในการทำเช่นนี้ (รับ CSV จาก postgres) คือการใช้COPY ... TO STDOUTคำสั่ง แม้ว่าคุณจะไม่ต้องการทำตามวิธีที่แสดงในคำตอบที่นี่ วิธีที่ถูกต้องในการใช้คำสั่งคือ:

COPY (select id, name from groups) TO STDOUT WITH CSV HEADER

จำคำสั่งเดียว!

มันยอดเยี่ยมสำหรับการใช้งานผ่าน ssh:

$ ssh psqlserver.example.com 'psql -d mydb "COPY (select id, name from groups) TO STDOUT WITH CSV HEADER"' > groups.csv

มันยอดเยี่ยมสำหรับการใช้งานภายใน docker over ssh:

$ ssh pgserver.example.com 'docker exec -tu postgres postgres psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv

มันยอดเยี่ยมมากสำหรับเครื่องจักรท้องถิ่น:

$ psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv

หรือนักเทียบท่าภายในเครื่องท้องถิ่น:

docker exec -tu postgres postgres psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv

หรือบน kubernetes cluster, ใน docker, มากกว่า HTTPS ??:

kubectl exec -t postgres-2592991581-ws2td 'psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv

เครื่องหมายจุลภาคที่หลากหลายมาก!

คุณยัง

ใช่ฉันทำนี่คือบันทึกของฉัน:

COPYses

ใช้/copyอย่างมีประสิทธิภาพดำเนินการการดำเนินงานไฟล์ในระบบใดpsqlคำสั่งที่ทำงานอยู่ในขณะที่ผู้ใช้ที่รันมัน1 หากคุณเชื่อมต่อกับเซิร์ฟเวอร์ระยะไกลคุณสามารถคัดลอกไฟล์ข้อมูลในระบบที่เรียกใช้งานpsqlไปยัง / จากเซิร์ฟเวอร์ระยะไกลได้ง่าย

COPYเรียกใช้งานการดำเนินการไฟล์บนเซิร์ฟเวอร์เป็นบัญชีผู้ใช้กระบวนการแบ็กเอนด์ (ค่าเริ่มต้นpostgres) เส้นทางไฟล์และการอนุญาตจะถูกตรวจสอบและนำไปใช้อย่างเหมาะสม ถ้าใช้TO STDOUTแล้วการตรวจสอบการอนุญาตของไฟล์จะถูกข้ามไป

ตัวเลือกทั้งสองนี้ต้องการการเคลื่อนไหวของไฟล์ในภายหลัง psqlไม่ได้ดำเนินการในระบบที่คุณต้องการให้ CSV ที่เป็นผลลัพธ์อยู่ในที่สุด นี่เป็นกรณีที่เป็นไปได้มากที่สุดในประสบการณ์ของฉันเมื่อคุณทำงานกับเซิร์ฟเวอร์ระยะไกลเป็นส่วนใหญ่

มันมีความซับซ้อนมากขึ้นในการกำหนดค่าบางอย่างเช่นอุโมงค์ TCP / IP บน ssh ไปยังระบบระยะไกลสำหรับเอาต์พุต CSV อย่างง่าย แต่สำหรับรูปแบบเอาต์พุตอื่น ๆ (ไบนารี) มันอาจจะดีกว่าที่จะ/copyผ่านการเชื่อมต่อที่ใช้ช่องpsqlสัญญาณ ในหลอดเลือดดำที่คล้ายกันสำหรับการนำเข้าขนาดใหญ่การย้ายไฟล์ต้นฉบับไปยังเซิร์ฟเวอร์และการใช้COPYอาจเป็นตัวเลือกที่มีประสิทธิภาพสูงสุด

พารามิเตอร์ PSQL

ด้วยพารามิเตอร์ psql คุณสามารถจัดรูปแบบผลลัพธ์เช่น CSV แต่มีข้อเสียเช่นต้องจำไว้ว่าให้ปิดใช้งานเพจเจอร์และไม่ได้รับส่วนหัว:

$ psql -P pager=off -d mydb -t -A -F',' -c 'select * from groups;'
2,Technician,Test 2,,,t,,0,,                                                                                                                                                                   
3,Truck,1,2017-10-02,,t,,0,,                                                                                                                                                                   
4,Truck,2,2017-10-02,,t,,0,,

เครื่องมืออื่น ๆ

ไม่ฉันต้องการนำ CSV ออกจากเซิร์ฟเวอร์ของฉันโดยไม่ต้องรวบรวมและ / หรือติดตั้งเครื่องมือ


1
ผลลัพธ์ได้รับการบันทึกไว้ที่ใด ข้อความค้นหาของฉันทำงาน แต่ไฟล์ไม่ปรากฏที่ใดก็ได้บนคอมพิวเตอร์ของฉัน นี่คือสิ่งที่ฉันทำ: คัดลอก (เลือก a, b จาก c โดยที่ d = '1') ไปยัง STDOUT ด้วย CSVHEADER> abcd.csv
kRazzy R

1
@kRazzyR เอาต์พุตไปที่ stdout ของคำสั่ง psql ดังนั้นท้ายที่สุดสิ่งที่คุณทำกับ stdout คือที่ที่ข้อมูลจะไป ในตัวอย่างของฉันฉันใช้ '> file.csv' เพื่อเปลี่ยนเส้นทางไปยังไฟล์ คุณต้องการตรวจสอบให้แน่ใจว่าอยู่นอกคำสั่งที่ถูกส่งไปยังเซิร์ฟเวอร์ผ่านพารามิเตอร์ psql -c ดูตัวอย่าง 'เครื่องท้องถิ่น'
joshperry

ขอบคุณสำหรับคำอธิบายที่สมบูรณ์ คำสั่ง copy ซับซ้อนอย่างสิ้นหวังด้วย psql ฉันมักจะใช้ไคลเอนต์ฐานข้อมูลฟรี (รุ่นชุมชน dbeaver) เพื่อนำเข้าและส่งออกไฟล์ข้อมูล มันมีเครื่องมือการทำแผนที่และการจัดรูปแบบที่ดี คำตอบของคุณให้รายละเอียดตัวอย่างที่ดีสำหรับการคัดลอกจากระบบระยะไกล
Rich Lysakowski ระดับปริญญาเอก

24

ฉันต้องใช้ \ COPY เพราะฉันได้รับข้อความแสดงข้อผิดพลาด:

ERROR:  could not open file "/filepath/places.csv" for writing: Permission denied

ดังนั้นฉันจึงใช้:

\Copy (Select address, zip  From manjadata) To '/filepath/places.csv' With CSV;

และมันก็ใช้งานได้


17

psql สามารถทำสิ่งนี้เพื่อคุณ:

edd@ron:~$ psql -d beancounter -t -A -F"," \
                -c "select date, symbol, day_close " \
                   "from stockprices where symbol like 'I%' " \
                   "and date >= '2009-10-02'"
2009-10-02,IBM,119.02
2009-10-02,IEF,92.77
2009-10-02,IEV,37.05
2009-10-02,IJH,66.18
2009-10-02,IJR,50.33
2009-10-02,ILF,42.24
2009-10-02,INTC,18.97
2009-10-02,IP,21.39
edd@ron:~$

ดูman psqlความช่วยเหลือเกี่ยวกับตัวเลือกที่ใช้ที่นี่


12
นี่ไม่ใช่ไฟล์ CSV จริง - ดูว่าเบิร์นถ้ามีเครื่องหมายจุลภาคในข้อมูล - ดังนั้นควรใช้การสนับสนุน COPY ในตัว แต่เทคนิคทั่วไปนี้มีประโยชน์เช่นเดียวกับการแฮ็คอย่างรวดเร็วสำหรับการส่งออกจาก Postgres ในรูปแบบที่มีตัวคั่นอื่นนอกเหนือจาก CSV
เกร็กสมิ ธ

16

ฉันกำลังทำงานกับ AWS Redshift ซึ่งไม่รองรับCOPY TOคุณสมบัตินี้

เครื่องมือ BI ของฉันรองรับ CSV ที่คั่นด้วยแท็บดังนั้นฉันจึงใช้สิ่งต่อไปนี้:

 psql -h dblocation -p port -U user -d dbname -F $'\t' --no-align -c "SELECT * FROM TABLE" > outfile.csv

16

รุ่นใหม่ - psql 12 - --csvจะให้การสนับสนุน

psql - devel

--csv

เปลี่ยนเป็นโหมดเอาต์พุต CSV (คั่นด้วยเครื่องหมายจุลภาค) นี้จะเทียบเท่ากับ\ รูปแบบ pset CSV


csv_fieldsep

ระบุตัวคั่นฟิลด์ที่จะใช้ในรูปแบบเอาต์พุต CSV หากอักขระตัวคั่นปรากฏในค่าของฟิลด์ฟิลด์นั้นจะถูกส่งออกภายในเครื่องหมายคำพูดคู่ตามกฎ CSV มาตรฐาน ค่าเริ่มต้นคือเครื่องหมายจุลภาค

การใช้งาน:

psql -c "SELECT * FROM pg_catalog.pg_tables" --csv  postgres

psql -c "SELECT * FROM pg_catalog.pg_tables" --csv -P csv_fieldsep='^'  postgres

psql -c "SELECT * FROM pg_catalog.pg_tables" --csv  postgres > output.csv

11

ใน pgAdmin III มีตัวเลือกในการส่งออกไปยังไฟล์จากหน้าต่างแบบสอบถาม ในเมนูหลักคือ Query -> Execute to file หรือมีปุ่มที่ทำสิ่งเดียวกัน (เป็นรูปสามเหลี่ยมสีเขียวที่มีแผ่นฟลอปปี้สีฟ้าเมื่อเทียบกับสามเหลี่ยมสีเขียวธรรมดาที่เพิ่งเรียกใช้แบบสอบถาม) หากคุณไม่ได้ใช้แบบสอบถามจากหน้าต่างแบบสอบถามแล้วฉันจะทำสิ่งที่แนะนำ IMSoP และใช้คำสั่งคัดลอก


คำตอบของ IMSoP ไม่ได้ผลสำหรับฉันเพราะฉันต้องเป็นผู้ดูแลระบบขั้นสูง สิ่งนี้ได้ผล ขอบคุณ!
Mike

9

ฉันลองหลายสิ่งหลายอย่าง แต่มีไม่กี่คนที่สามารถให้ CSV ที่ฉันต้องการพร้อมรายละเอียดส่วนหัว

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน

psql -d dbame -U username \
  -c "COPY ( SELECT * FROM TABLE ) TO STDOUT WITH CSV HEADER " > \
  OUTPUT_CSV_FILE.csv

9

ฉันได้เขียนเครื่องมือเล็กน้อยที่เรียกpsql2csvว่า encapsulate COPY query TO STDOUTรูปแบบทำให้เกิด CSV ที่เหมาะสม psqlอินเตอร์เฟซของมันจะคล้ายกับ

psql2csv [OPTIONS] < QUERY
psql2csv [OPTIONS] QUERY

แบบสอบถามจะถือว่าเป็นเนื้อหาของ STDIN ถ้ามีหรืออาร์กิวเมนต์สุดท้าย อาร์กิวเมนต์อื่นทั้งหมดถูกส่งต่อไปยัง psql ยกเว้นสิ่งเหล่านี้:

-h, --help           show help, then exit
--encoding=ENCODING  use a different encoding than UTF8 (Excel likes LATIN1)
--no-header          do not output a header

2
ใช้งานได้ดี ขอบคุณ.
AlexM

6

หากคุณมีเคียวรีนานขึ้นและคุณต้องการใช้ psql ให้ใส่เคียวรีของคุณไปยังไฟล์และใช้คำสั่งต่อไปนี้:

psql -d my_db_name -t -A -F";" -f input-file.sql -o output-file.csv

FWIW ฉันต้องใช้-F","แทน-F";"การสร้างไฟล์ CSV ที่จะเปิดอย่างถูกต้องใน MS Excel
CFL_Jeff

4

ในการดาวน์โหลดไฟล์ CSV ที่มีชื่อคอลัมน์ในฐานะ HEADER ให้ใช้คำสั่งนี้:

Copy (Select * From tableName) To '/tmp/fileName.csv' With CSV HEADER;

1

ฉันขอแนะนำDataGrip , IDE ฐานข้อมูลโดย JetBrains คุณสามารถส่งออกแบบสอบถาม SQL ไปยังไฟล์ CSVและสามารถตั้งค่าช่องสัญญาณ ssh ได้อย่างง่ายดาย เมื่อเอกสารอ้างอิงถึง "ชุดผลลัพธ์" เอกสารเหล่านั้นหมายถึงผลลัพธ์ที่ส่งคืนโดยแบบสอบถาม SQL ในคอนโซล

ฉันไม่ได้เกี่ยวข้องกับ DataGrip ฉันรักผลิตภัณฑ์มาก!


ฉันเดาว่าการลงคะแนนนั้นเกิดจากการขาดบริบท / คำอธิบายดังนั้นฉันจึงเชื่อมโยงกับเอกสาร DataGrip หากมีเหตุผลอื่นสำหรับการลงคะแนนเสียงโปรดแจ้งให้เราทราบ ฉันใช้โซลูชัน CLI ด้านบนและ DataGrip นั้นง่ายกว่ามากสำหรับการสืบค้นขนาดเล็ก
skeller88

ปัญหาเกี่ยวกับ DataGrip คือมันทำให้คุณเกาะติดกระเป๋าเงินของคุณ มันไม่ฟรี ลองรุ่นชุมชน DBeaver ที่dbeaver.io มันเป็นเครื่องมือฐานข้อมูลแบบหลายแพลตฟอร์ม FOSS สำหรับโปรแกรมเมอร์ SQL, DBAs และนักวิเคราะห์ที่สนับสนุนฐานข้อมูลยอดนิยมทั้งหมด: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Hive, Presto ฯลฯ
Rich Lysakowski ระดับปริญญาเอก

เจ๋งฉันจะตรวจสอบว่า คุณจะโพสต์ความคิดเห็นของคุณเป็นคำตอบด้วยหรือไม่
skeller88

0

JackDBลูกค้าฐานข้อมูลในเว็บเบราว์เซอร์ของคุณทำให้เป็นเรื่องง่ายมาก โดยเฉพาะอย่างยิ่งถ้าคุณอยู่ใน Heroku

มันช่วยให้คุณเชื่อมต่อกับฐานข้อมูลระยะไกลและเรียกใช้แบบสอบถาม SQL ในพวกเขา

                                                                                                                                                       ที่มา (ที่มา: jackdb.com )jackdb-Heroku


เมื่อเชื่อมต่อฐานข้อมูลแล้วคุณสามารถเรียกใช้แบบสอบถามและส่งออกเป็น CSV หรือ TXT (ดูด้านล่างขวา)


jackdb ส่งออก

หมายเหตุ:ฉันไม่มีส่วนเกี่ยวข้องกับ JackDB ปัจจุบันฉันใช้บริการฟรีและคิดว่าเป็นผลิตภัณฑ์ที่ยอดเยี่ยม


0

ตามคำขอของ @ skeller88 ฉันจะโพสต์ความคิดเห็นของฉันใหม่เป็นคำตอบเพื่อไม่ให้คนที่อ่านคำตอบไม่หาย

ปัญหาเกี่ยวกับ DataGrip คือมันทำให้คุณเกาะติดกระเป๋าเงินของคุณ มันไม่ฟรี ลอง DBeaver รุ่นชุมชนที่ dbeaver.io มันเป็นเครื่องมือฐานข้อมูลแบบหลายแพลตฟอร์ม FOSS สำหรับโปรแกรมเมอร์ SQL, DBAs และนักวิเคราะห์ที่สนับสนุนฐานข้อมูลยอดนิยมทั้งหมด: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Hive, Presto ฯลฯ

DBeaver Community Edition ทำให้การเชื่อมต่อกับฐานข้อมูลออกแบบสอบถามเพื่อดึงข้อมูลจากนั้นดาวน์โหลดชุดผลลัพธ์เพื่อบันทึกลงใน CSV, JSON, SQL หรือรูปแบบข้อมูลทั่วไปอื่น ๆ มันเป็นคู่แข่ง FOSS ที่ทำงานได้เพื่อ TOAD สำหรับ Postgres, TOAD สำหรับ SQL Server หรือ Toad สำหรับ Oracle

ฉันไม่มีส่วนเกี่ยวข้องกับ DBeaver ฉันชอบราคาและฟังก์ชันการทำงาน แต่ฉันหวังว่าพวกเขาจะเปิดแอปพลิเคชัน DBeaver / Eclipse ให้มากขึ้นและทำให้ง่ายต่อการเพิ่มวิดเจ็ตการวิเคราะห์ลงใน DBeaver / Eclipse แทนที่จะต้องการให้ผู้ใช้ชำระค่าสมัครรายปีเพื่อสร้างกราฟและแผนภูมิโดยตรงภายใน แอปพลิเคชัน ทักษะการเขียนโค้ด Java ของฉันมีสนิมและฉันไม่รู้สึกอยากใช้เวลาหลายสัปดาห์เพื่อเรียนรู้วิธีสร้างวิดเจ็ต Eclipse เพียงเพื่อจะพบว่า DBeaver ได้ปิดการใช้งานความสามารถในการเพิ่มวิดเจ็ตบุคคลที่สามลงใน DBeaver Community Edition

ผู้ใช้ DBeaver มีข้อมูลเชิงลึกเกี่ยวกับขั้นตอนในการสร้างวิดเจ็ตการวิเคราะห์เพื่อเพิ่มลงใน Community Edition ของ DBeaver หรือไม่


-3
import json
cursor = conn.cursor()
qry = """ SELECT details FROM test_csvfile """ 
cursor.execute(qry)
rows = cursor.fetchall()

value = json.dumps(rows)

with open("/home/asha/Desktop/Income_output.json","w+") as f:
    f.write(value)
print 'Saved to File Successfully'

3
โปรดอธิบายสิ่งที่คุณแก้ไขคำตอบหลีกเลี่ยงการใช้รหัสตอบเท่านั้น
GGO

3
ขอบคุณสำหรับข้อมูลโค้ดนี้ซึ่งอาจให้ความช่วยเหลือระยะสั้นแบบ จำกัด คำอธิบายที่เหมาะสมจะช่วยเพิ่มมูลค่าในระยะยาวได้อย่างมากโดยการแสดงว่าเหตุใดจึงเป็นวิธีแก้ปัญหาที่ดีและจะทำให้มีประโยชน์มากขึ้นสำหรับผู้อ่านในอนาคตด้วยคำถามอื่น ๆ ที่คล้ายกัน โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายรวมถึงข้อสมมติฐานที่คุณทำ
Toby Speight

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