स्थानीय मशीन पर CSV फ़ाइल में दूरस्थ पोस्टग्रेज तालिका निर्यात करें


16

मेरे पास रिमोट सर्वर पर डेटाबेस तक केवल पढ़ने के लिए पहुंच है। इसलिए, मैं निष्पादित कर सकता हूं:

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

लेकिन उस सर्वर पर मुझे फ़ाइल बनाने / सहेजने की अनुमति नहीं है, इसलिए मुझे अपनी स्थानीय मशीन पर ऐसा करने की आवश्यकता है।

जब मैं दूरस्थ डेटाबेस से जुड़ता हूं, तो मैं दूरस्थ सर्वर के बजाय अपने स्थानीय मशीन पर फ़ाइल को सहेजने के लिए एक कमांड कैसे निष्पादित कर सकता हूं?

या, मैं दूरस्थ डेटाबेस से कनेक्ट करने के लिए लिनक्स कमांड को कैसे निष्पादित कर सकता हूं, एक क्वेरी निष्पादित कर सकता हूं, और आउटपुट को मेरी स्थानीय मशीन पर फ़ाइल के रूप में सहेज सकता हूं?

जवाबों:


29

पहले से सुझाए गए दोनों दृष्टिकोण अनावश्यक रूप से जटिल प्रतीत होते हैं।

बस उपयोग में psqlनिर्मित \copyकमांड का उपयोग करें , जो सर्वर-साइड की तरह काम करता है, COPYलेकिन क्लाइंट के लिए वायर प्रोटोकॉल पर एक कॉपी करता है और क्लाइंट पथ का उपयोग करता है।

क्योंकि यह एक psqlबैकस्लैश कमांड है जो आप अनुगामी अर्धविराम को छोड़ते हैं, जैसे:

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

देखें के लिए मैनुअल में प्रवेश आदेश और आदेश documenation और अधिक विस्तार के लिए।\copypsqlCOPY

जैसे COPYआप डेटा को कॉपी करते समय टेबल नाम के बजाय क्वेरी के \copyसाथ उपयोग कर सकते हैं (SELECT ...)(लेकिन अंदर नहीं)।


एक आम तौर पर घटिया विकल्प जो कुछ सीमित स्थितियों में उपयोगी हो सकता है:

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

और -oफ़ाइल में आउटपुट लिखने के लिए ध्वज या शेल आउटपुट पुनर्निर्देशन का उपयोग करें। आपको इसे \copyप्राथमिकता में लगभग हमेशा उपयोग करना चाहिए ।


लेकिन यह लेनदेन के लिए अनुमति नहीं देता है :(
रेजा एस

उम, यकीन है कि यह करता है। psqlएक स्क्रिप्ट को खिलाने के लिए यहां से दस्तावेज का उपयोग करें , साथ शुरू BEGIN, फिर अपनी \copyआज्ञाओं को करना, फिर ए COMMIT। या psql -fयहाँ एक दस्तावेज़ का उपयोग करने के बजाय एक स्क्रिप्ट चलाने के लिए उपयोग करें।
क्रेग रिंगर

वापस पाने के लिए धन्यवाद ... यही कि मैं क्या कर रहा हूं और इसने काम किया =)
रेजा एस

आप -Aइसके बजाय का उपयोग कर सकते हैं -P format=unalignedऔर मुझे भी लगता है कि आपको जरूरत है-P fieldsep=,
इवान कैरोल

2

लिनक्स कमांड है:

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

1
यह CSV का उत्पादन नहीं करेगा, यह स्वरूपित पाठ आउटपुट का उत्पादन करेगा। यदि आप -t -P format=unaligned उस कमांड में जुड़ते हैं, तो आपको बग्गी पाइप-सीमांकित CSV की तरह कुछ और करीब मिलेगा, लेकिन पाठ में पाइप बच नहीं पाएंगे, इसलिए यह अमान्य होगा।
क्रेग रिंगर

ओह, आप यह भी -P fieldsep=','छोड़ना चाहेंगे कि भागने की कमी के कारण त्रुटियों की संभावना अधिक होगी। -P fieldsep_zero=onयदि आप अशक्त-बाइट-सीमांकित पाठ को पार्स करने में कोई आपत्ति नहीं करते हैं, तो ठीक होगा क्योंकि अशक्त बाइट्स psqlस्वाभाविक रूप से आउटपुट में नहीं हो सकते ।
क्रेग रिंगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.