PostgreSQL से एक CSV फ़ाइल में पीएल/pgSQL आउटपुट सहेजें




postgresql-copy (10)

PostgreSQL डेटाबेस से पीएस / पीजीएसक्यूएल आउटपुट को सीएसवी फ़ाइल में सहेजने का सबसे आसान तरीका क्या है?

मैं pgAdmin III और PSQL प्लगइन के साथ PostgreSQL 8.4 का उपयोग कर रहा हूं जहां से मैं क्वेरी चलाता हूं।


PgAdmin III में क्वेरी विंडो से फ़ाइल में निर्यात करने का एक विकल्प है। मुख्य मेनू में यह क्वेरी है -> फ़ाइल करने के लिए निष्पादित करें या एक बटन है जो एक ही चीज करता है (यह नीली फ्लॉपी डिस्क के साथ एक हरा त्रिकोण है जो सादे हरे त्रिकोण के विपरीत है जो केवल क्वेरी चलाता है)। यदि आप क्वेरी विंडो से क्वेरी नहीं चला रहे हैं तो मैं करता हूं कि IMSoP ने सुझाव दिया और कॉपी कमांड का उपयोग करें।


कई समाधान हैं:

1 psql कमांड

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

इसका बड़ा फायदा यह है कि आप इसे एसएसएच के माध्यम से उपयोग कर सकते हैं, जैसे ssh [email protected] command - आपको प्राप्त करने में सक्षम बनाता है

2 पोस्टग्रेस copy कमांड

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 लेकिन यह पटकथा नहीं है।


टर्मिनल में (डीबी से कनेक्ट होने पर) सीवीएस फ़ाइल में आउटपुट सेट करें

1) फ़ील्ड सेपरेटर को ',' सेट करें:

\f ','

2) सेट आउटपुट प्रारूप unaligned सेट करें:

\a

3) केवल tuples दिखाओ:

\t

4) आउटपुट सेट करें:

\o '/tmp/yourOutputFile.csv'

5) अपनी क्वेरी निष्पादित करें:

:select * from YOUR_TABLE

6) आउटपुट:

\o

फिर आप इस स्थान पर अपनी सीएसवी फ़ाइल पा सकेंगे:

cd /tmp

इसे scp कमांड का उपयोग करके कॉपी करें या नैनो का उपयोग करके संपादित करें:

nano /tmp/yourOutputFile.csv

मुझे \ 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;

और यह काम कर रहा है


मैंने psql2csv नामक एक छोटा सा टूल लिखा है जो psql2csv COPY query TO STDOUT पैटर्न में समाहित करता है, जिसके परिणामस्वरूप उचित सीएसवी होता है। यह इंटरफ़ेस 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

मैंने कई चीजों की कोशिश की लेकिन उनमें से कम मुझे हेडर विवरण के साथ वांछित सीएसवी देने में सक्षम था।

यहां मेरे लिए काम किया गया है।

psql -d dbame -U उपयोगकर्ता नाम-सी "सीएसवी हेडर के साथ स्टॉप करने के लिए कॉपी करें (तालिका से चुनें)>> OUTPUT_CSV_FILE.csv


यदि आपके पास लंबी क्वेरी है और आप psql का उपयोग करना चाहते हैं तो अपनी क्वेरी को फ़ाइल में रखें और निम्न आदेश का उपयोग करें:

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

यह जानकारी वास्तव में अच्छी तरह से प्रतिनिधित्व नहीं है। चूंकि यह दूसरी बार है कि मुझे इसे प्राप्त करने की आवश्यकता है, मैं इसे और याद दिलाने के लिए यहां रखूंगा यदि कुछ और नहीं।

वास्तव में ऐसा करने का सबसे अच्छा तरीका (पोस्टग्रेज़ से सीएसवी प्राप्त करें) को COPY ... TO STDOUT करने के लिए COPY ... TO STDOUT कमांड का उपयोग करना है। यद्यपि आप यहां जवाबों में दिखाए गए तरीके को नहीं करना चाहते हैं। आदेश का उपयोग करने का सही तरीका है:

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

केवल एक कमांड याद रखें!

एसएसएच पर उपयोग के लिए यह बहुत अच्छा है:

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

एसएसएच पर डॉकर के अंदर उपयोग के लिए यह बहुत अच्छा है:

$ 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

या एक क्यूबेरेट्स क्लस्टर पर, डॉकर में, HTTPS से अधिक ??:

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

तो बहुमुखी, बहुत कॉमा!

क्या आप कभी?

हाँ मैंने किया, यहां मेरे नोट्स हैं:

कॉपिस

psql कमांड चल रहा है, जो उपयोगकर्ता इसे निष्पादित कर रहा है, पर किसी भी सिस्टम पर फ़ाइल ऑपरेशंस को प्रभावी ढंग से निष्पादित करता है। यदि आप किसी दूरस्थ सर्वर से कनेक्ट करते हैं, तो दूरस्थ सर्वर से / psql निष्पादित सिस्टम पर डेटा फ़ाइलों की प्रतिलिपि बनाना आसान है।

COPY सर्वर पर फ़ाइल संचालन निष्पादित करता है क्योंकि बैकएंड प्रक्रिया उपयोगकर्ता खाता (डिफ़ॉल्ट postgres ), फ़ाइल पथ और अनुमतियां चेक की जाती हैं और तदनुसार लागू होती हैं। यदि TO STDOUT का उपयोग करना है तो फ़ाइल अनुमति जांच को छोड़ दिया जाता है।

इन दोनों विकल्पों को बाद में फ़ाइल आंदोलन की आवश्यकता होती है यदि psql उस सिस्टम पर निष्पादित नहीं कर रहा है जहां आप परिणामी सीएसवी को अंततः निवास करना चाहते हैं। यह मेरे अनुभव में सबसे अधिक संभावना है, जब आप ज्यादातर रिमोट सर्वर के साथ काम करते हैं।

सरल सीएसवी आउटपुट के लिए रिमोट सिस्टम पर एसएसएच पर एक टीसीपी / आईपी सुरंग जैसे कुछ को कॉन्फ़िगर करना अधिक जटिल है, लेकिन अन्य आउटपुट प्रारूपों (बाइनरी) के लिए यह स्थानीय psql निष्पादित करने के लिए एक सुरंग कनेक्शन पर /copy हो सकता है। इसी तरह की नस में, बड़े आयात के लिए, स्रोत फ़ाइल को सर्वर पर ले जाना और COPY का उपयोग करना शायद उच्चतम प्रदर्शन विकल्प है।

पीएसक्यूएल पैरामीटर्स

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,,

अन्य उपकरण

नहीं, मैं बस एक उपकरण को संकलित और / या स्थापित किए बिना अपने सर्वर से सीएसवी प्राप्त करना चाहता हूं।


psql यह आपके लिए कर सकता है:

[email protected]:~$ 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
[email protected]:~$

यहां इस्तेमाल किए गए विकल्पों पर सहायता के लिए man psql देखें।


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'




postgresql-copy