जवाबों:
क्या आप सर्वर पर, या क्लाइंट पर परिणामी फ़ाइल चाहते हैं?
यदि आप फिर से उपयोग या स्वचालित करने के लिए कुछ आसान चाहते हैं, तो आप COPY कमांड में निर्मित Postgresql का उपयोग कर सकते हैं । जैसे
Copy (Select * From foo) To '/tmp/test.csv' With CSV DELIMITER ',' HEADER;
यह दृष्टिकोण पूरी तरह से रिमोट सर्वर पर चलता है - यह आपके स्थानीय पीसी पर नहीं लिख सकता है। इसे पोस्टग्रेज "सुपरसुसर" (जिसे आमतौर पर "रूट" कहा जाता है) के रूप में चलाने की आवश्यकता होती है क्योंकि पोस्टग्रेज इसे मशीन के स्थानीय फाइल सिस्टम के साथ गंदा काम करने से रोक नहीं सकते हैं।
इसका मतलब यह नहीं है कि आपको एक सुपरयुसर के रूप में जोड़ा जाना चाहिए (स्वचालित रूप से एक अलग तरह का सुरक्षा जोखिम होगा), क्योंकि आप एक फ़ंक्शन बनाने के लिए SECURITY DEFINER
विकल्प काCREATE FUNCTION
उपयोग कर सकते हैं जो एक सुपरयूज़र के रूप में चलता है ।
महत्वपूर्ण हिस्सा यह है कि आपका फ़ंक्शन अतिरिक्त चेक करने के लिए है, न कि केवल सुरक्षा पास करने के लिए - इसलिए आप एक फ़ंक्शन लिख सकते हैं जो आपको आवश्यक सटीक डेटा निर्यात करता है, या आप कुछ लिख सकते हैं जो विभिन्न विकल्पों को स्वीकार कर सकते हैं जब तक कि वे एक सख्त वाइटेलिस्ट से मिलें। आपको दो चीजों की जाँच करने की आवश्यकता है:
GRANT
से डेटाबेस में s द्वारा परिभाषित किया जाएगा , लेकिन फ़ंक्शन अब एक सुपरयुसर के रूप में चल रहा है, इसलिए तालिकाएं जो सामान्य रूप से "सीमा से बाहर" होंगी, पूरी तरह से सुलभ होंगी। आप शायद किसी को अपने कार्य को शुरू नहीं करने देना चाहते हैं और अपने "उपयोगकर्ता" तालिका के अंत में पंक्तियाँ जोड़ना चाहते हैं ...मैंने इस दृष्टिकोण पर विस्तार करते हुए एक ब्लॉग पोस्ट लिखा है , जिसमें कुछ ऐसे फ़ंक्शंस शामिल हैं जो सख्त शर्तों को पूरा करने वाली फ़ाइलों और तालिकाओं को निर्यात (या आयात) करते हैं।
अन्य तरीका यह है कि फाइल को क्लाइंट साइड पर , यानी आपके एप्लिकेशन या स्क्रिप्ट में किया जाए। पोस्टग्रेज सर्वर को यह जानने की जरूरत नहीं है कि आप किस फाइल की नकल कर रहे हैं, यह सिर्फ डेटा को बाहर निकालता है और क्लाइंट इसे कहीं रख देता है।
इसके लिए अंतर्निहित सिंटैक्स COPY TO STDOUT
कमांड है, और pgAdmin जैसे ग्राफिकल टूल इसे आपके लिए एक अच्छे संवाद में लपेटेंगे।
psql
कमांड लाइन ग्राहक एक विशेष "मेटा-आदेश" कहा जाता है \copy
, जो "वास्तविक" सभी एक ही विकल्प लेता है COPY
, लेकिन ग्राहक के अंदर चलाया जाता है:
\copy (Select * From foo) To '/tmp/test.csv' With CSV
ध्यान दें कि कोई समाप्ति नहीं है ;
, क्योंकि मेटा-कमांड एसक्यूएल कमांड के विपरीत, नईलाइन द्वारा समाप्त किए जाते हैं।
से डॉक्स :
साइक अनुदेश \ कॉपी के साथ कॉपी को भ्रमित न करें। \ copy STDIN से COPY को कॉपी करता है या STDOUT को कॉपी करता है, और फिर psql क्लाइंट के लिए सुलभ फ़ाइल में डेटा संग्रहीत / संग्रहीत करता है। इस प्रकार, फ़ाइल की पहुँच और पहुँच अधिकार क्लाइंट पर निर्भर करते हैं न कि सर्वर की जब \ copy का उपयोग किया जाता है।
आपकी एप्लिकेशन प्रोग्रामिंग भाषा में डेटा को पुश करने या लाने के लिए भी समर्थन हो सकता है , लेकिन आप आमतौर पर एक मानक SQL स्टेटमेंट के भीतर COPY FROM STDIN
/ उपयोग नहीं कर सकते TO STDOUT
, क्योंकि इनपुट / आउटपुट स्ट्रीम को जोड़ने का कोई तरीका नहीं है। PHP के PostgreSQL हैंडलर ( पीडीओ नहीं ) में बहुत बुनियादी pg_copy_from
और pg_copy_to
फ़ंक्शंस शामिल हैं जो एक PHP सरणी से / के लिए कॉपी करते हैं, जो बड़े डेटा सेट के लिए कुशल नहीं हो सकता है।
\copy
काम करता है, भी - वहाँ, पथ क्लाइंट के सापेक्ष हैं, और किसी अर्धविराम की आवश्यकता / अनुमति नहीं है। मेरा संपादन देखें।
\copy
वन-लाइनर होना जरूरी है। इसलिए आपको अपनी इच्छानुसार sql को फ़ॉर्मेट करने और उसके चारों ओर कॉपी / फ़ंक्शन लगाने की सुंदरता नहीं मिलती है।
\copy
एक विशेष मेटा-कमांड हैpsql
। यह pgAdmin जैसे अन्य क्लाइंट में काम नहीं करेगा; इस कार्य को करने के लिए उनके पास संभवतः अपने स्वयं के उपकरण होंगे, जैसे कि ग्राफिकल विज़ार्ड्स।
कई समाधान हैं:
psql
आज्ञाpsql -d dbname -t -A -F"," -c "select * from users" > output.csv
इसका बड़ा फायदा है कि आप इसे SSH के माध्यम से उपयोग कर सकते हैं, जैसे ssh postgres@host command
- आपको प्राप्त करने के लिए सक्षम करना
copy
कमांडCOPY (SELECT * from users) To '/tmp/output.csv' With CSV;
>psql dbname
psql>\f ','
psql>\a
psql>\o '/tmp/output.csv'
psql>SELECT * from users;
psql>\q
उन सभी को स्क्रिप्ट में उपयोग किया जा सकता है, लेकिन मैं # 1 पसंद करता हूं।
टर्मिनल में (db से जुड़ा होने पर) cv फाइल में आउटपुट सेट करता है
1) सेट फ़ील्ड सेपरेटर को ','
:
\f ','
2) सेट आउटपुट स्वरूप अनलग:
\a
3) केवल टुपल्स दिखाएँ:
\t
4) सेट उत्पादन:
\o '/tmp/yourOutputFile.csv'
5) अपनी क्वेरी निष्पादित करें:
:select * from YOUR_TABLE
6) आउटपुट:
\o
फिर आप इस स्थान पर अपनी सीएसवी फ़ाइल पा सकेंगे:
cd /tmp
scp
कमांड का उपयोग करके इसे कॉपी करें या नैनो का उपयोग करके संपादित करें:
nano /tmp/yourOutputFile.csv
COPY
या \copy
सही ढंग से संभाल दृष्टिकोण (परिवर्तित मानक सीएसवी प्रारूप के लिए); क्या ये?
यदि आप शीर्ष लेख के साथ किसी विशेष तालिका के सभी स्तंभों में रुचि रखते हैं, तो आप उपयोग कर सकते हैं
COPY table TO '/some_destdir/mycsv.csv' WITH CSV HEADER;
यह की तुलना में एक छोटा सा सरल है
COPY (SELECT * FROM table) TO '/some_destdir/mycsv.csv' WITH CSV HEADER;
जो, मेरे सर्वश्रेष्ठ ज्ञान के बराबर हैं।
यह जानकारी वास्तव में अच्छी तरह से प्रतिनिधित्व नहीं करती है। जैसा कि यह दूसरी बार है जब मुझे इसे प्राप्त करने की आवश्यकता है, मैं इसे खुद को याद दिलाने के लिए यहां रखूंगा अगर कुछ और नहीं।
वास्तव में ऐसा करने का सबसे अच्छा तरीका है (सीएसवी को पोस्टग्रेट्स से बाहर निकालें) 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
यह ssh पर docker के अंदर उपयोग के लिए बहुत अच्छा है:
$ 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 के अंदर ?:
docker exec -tu postgres postgres psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv
या कुबेरनेट्स क्लस्टर पर, डॉकटर में, एचटीटीपीएस से अधिक ??
kubectl exec -t postgres-2592991581-ws2td 'psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv
इतना बहुमुखी, बहुत अल्पविराम!
हां मैंने किया, यहां मेरे नोट्स हैं:
का उपयोग करते हुए /copy
प्रभावी रूप से जो कुछ भी सिस्टम पर फ़ाइल आपरेशन निष्पादित करता है psql
, आदेश पर चल रहा है उपयोगकर्ता के लिए जो यह निष्पादित हो रहा है के रूप में 1 । यदि आप किसी दूरस्थ सर्वर से कनेक्ट करते हैं, तो दूरस्थ सर्वर psql
से / के लिए निष्पादित सिस्टम पर डेटा फ़ाइलों को कॉपी करना सरल है ।
COPY
सर्वर पर फ़ाइल संचालन निष्पादित करता है क्योंकि बैकएंड प्रक्रिया उपयोगकर्ता खाता (डिफ़ॉल्ट postgres
), फ़ाइल पथ और अनुमतियाँ जाँच और तदनुसार लागू होती हैं। यदि उपयोग कर रहे हैं TO STDOUT
तो फ़ाइल अनुमतियों की जाँच बाईपास की जाती है।
इन दोनों विकल्पों को बाद के फ़ाइल आंदोलन की आवश्यकता होती है यदि psql
आप उस सिस्टम पर निष्पादित नहीं कर रहे हैं जहां आप परिणामी CSV चाहते हैं, तो अंततः। मेरे अनुभव में, जब आप ज्यादातर दूरस्थ सर्वर के साथ काम करते हैं, तो यह सबसे अधिक संभावना है।
सरल CSV आउटपुट के लिए दूरस्थ सिस्टम पर ssh पर TCP / IP टनल को कॉन्फ़िगर करने के लिए यह अधिक जटिल है, लेकिन अन्य आउटपुट फॉर्मेट (बाइनरी) के लिए यह /copy
टनल कनेक्शन से बेहतर हो सकता है , एक लोकल को निष्पादित करना psql
। एक समान नस में, बड़े आयात के लिए, स्रोत फ़ाइल को सर्वर में ले जाना और उपयोग करना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,,
नहीं, मैं बस अपने सर्वर से CSV को बिना किसी उपकरण को संकलित और / या स्थापित किए बिना प्राप्त करना चाहता हूं।
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
यहां उपयोग किए गए विकल्पों पर मदद के लिए देखें ।
नया संस्करण - psql 12 - समर्थन करेगा --csv
।
--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
PgAdmin III में क्वेरी विंडो से फाइल करने के लिए निर्यात करने का विकल्प है। मुख्य मेनू में यह क्वेरी है -> फाइल करने के लिए निष्पादित करें या एक बटन है जो एक ही काम करता है (यह एक हरे रंग की त्रिकोण है जिसमें एक नीली फ्लॉपी डिस्क है जो सादे हरे त्रिकोण के विपरीत है जो बस क्वेरी चलाता है)। यदि आप क्वेरी विंडो से क्वेरी नहीं चला रहे हैं तो मैं वही करूंगा जो IMSoP ने सुझाया था और कॉपी कमांड का उपयोग किया था।
मैंने थोड़ा उपकरण लिखा है जिसे पैटर्न कहा जाता psql2csv
है 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
यदि आपके पास लंबी क्वेरी है और आप psql का उपयोग करना पसंद करते हैं तो अपनी क्वेरी को किसी फ़ाइल में डालें और निम्न कमांड का उपयोग करें:
psql -d my_db_name -t -A -F";" -f input-file.sql -o output-file.csv
-F","
करना था -F";"
जो MS Excel में सही रूप से खुलेगा
मैं JetGrains द्वारा एक डेटाबेस IDE DataGrip की अत्यधिक अनुशंसा करता हूं । आप एक CSV फ़ाइल में SQL क्वेरी निर्यात कर सकते हैं , और आसानी से ssh टनलिंग सेट कर सकते हैं। जब दस्तावेज़ीकरण "परिणाम सेट" को संदर्भित करता है, तो उनका मतलब है कि कंसोल में SQL क्वेरी द्वारा लौटाया गया परिणाम।
मैं DataGrip से जुड़ा नहीं हूं, मुझे सिर्फ उत्पाद पसंद है!
जैकबडी , आपके वेब ब्राउज़र का एक डेटाबेस क्लाइंट, यह वास्तव में आसान बनाता है। खासकर यदि आप हरोकू पर हैं।
यह आपको दूरस्थ डेटाबेस से कनेक्ट करने और उन पर SQL क्वेरी चलाने देता है।
स्रोत
(स्रोत: jackdb.com )
एक बार आपका DB कनेक्ट होने के बाद, आप एक क्वेरी चला सकते हैं और CSV या TXT को निर्यात कर सकते हैं (नीचे दाईं ओर देखें)।
नोट: मैं किसी भी तरह से जैकबीडी से संबद्ध नहीं हूं। मैं वर्तमान में उनकी मुफ्त सेवाओं का उपयोग करता हूं और लगता है कि यह एक बेहतरीन उत्पाद है।
@ Skeller88 के अनुरोध के अनुसार, मैं अपनी टिप्पणी को एक उत्तर के रूप में प्रस्तुत कर रहा हूं ताकि यह उन लोगों द्वारा खो न जाए जो हर समय ऐसा नहीं करते हैं ...
DataGrip के साथ समस्या यह है कि यह आपके वॉलेट पर पकड़ बनाता है। यह स्वतंत्र नहीं है। Dbeaver.io पर DBeaver के सामुदायिक संस्करण का प्रयास करें। यह SQL प्रोग्रामर, DBA और विश्लेषकों के लिए एक FOSS मल्टी-प्लेटफ़ॉर्म डेटाबेस टूल है जो सभी लोकप्रिय डेटाबेस का समर्थन करता है: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Hive, Presto, आदि।
DBeaver सामुदायिक संस्करण एक डेटाबेस से जुड़ने के लिए तुच्छ बनाता है, डेटा पुनः प्राप्त करने के लिए क्वेरीज़ जारी करता है, और फिर इसे CSV, JSON, SQL, या अन्य सामान्य डेटा स्वरूपों में सहेजने के लिए सेट किया गया परिणाम डाउनलोड करता है। यह पोस्टग्रैड्स के लिए TOAD, SQL सर्वर के लिए TOAD, या Oracle के लिए टॉड के लिए एक व्यवहार्य FOSS प्रतियोगी है।
DBeaver के साथ मेरा कोई जुड़ाव नहीं है। मुझे कीमत और कार्यक्षमता पसंद है, लेकिन मेरी इच्छा है कि वे DBeaver / Eclipse एप्लीकेशन को और खोलेंगे और DBeaver / Eclipse में एनालिटिक्स विजेट जोड़ना आसान कर देंगे, बजाय इसके कि यूजर्स को सीधे ग्राफ और चार्ट बनाने के लिए वार्षिक सदस्यता के लिए भुगतान करना पड़े। आवेदन पत्र। मेरे जावा कोडिंग कौशल जंग खाए हुए हैं और मुझे यह महसूस करने में हफ्तों का समय नहीं लगता कि ग्रहण विजेट्स का निर्माण कैसे करें, केवल यह जानने के लिए कि DBeaver ने DBeaver सामुदायिक संस्करण में तृतीय-पक्ष विजेट जोड़ने की क्षमता को अक्षम कर दिया है।
क्या DBeaver उपयोगकर्ताओं को DBeaver के सामुदायिक संस्करण में जोड़ने के लिए एनालिटिक्स विगेट्स बनाने के चरणों के रूप में अंतर्दृष्टि है?
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'