क्या आप परिणामी फ़ाइल सर्वर पर या क्लाइंट पर चाहते हैं?
सर्वर साइड
यदि आप पुन:उपयोग या स्वचालित करने के लिए कुछ आसान चाहते हैं, तो आप Postgresql के COPY कमांड में निर्मित का उपयोग कर सकते हैं। उदा.
Copy (Select * From foo) To '/tmp/test.csv' With CSV DELIMITER ',' HEADER;
यह दृष्टिकोण पूरी तरह से दूरस्थ सर्वर पर चलता है - यह आपके स्थानीय पीसी पर नहीं लिख सकता है। इसे पोस्टग्रेज "सुपरयूजर" (आमतौर पर "रूट" कहा जाता है) के रूप में चलाने की जरूरत है क्योंकि पोस्टग्रेज इसे उस मशीन के स्थानीय फाइल सिस्टम के साथ बुरा काम करने से नहीं रोक सकता है।
इसका वास्तव में मतलब यह नहीं है कि आपको एक सुपरयूज़र के रूप में कनेक्ट होना होगा (स्वचालित करना जो एक अलग तरह का सुरक्षा जोखिम होगा), क्योंकि आप SECURITY DEFINER
का उपयोग कर सकते हैं। CREATE FUNCTION
. का विकल्प एक फ़ंक्शन बनाने के लिए जो चलता है जैसे कि आप एक सुपरयुसर थे .
महत्वपूर्ण हिस्सा यह है कि आपका कार्य अतिरिक्त जांच करने के लिए है, न कि केवल सुरक्षा को बाय-पास करने के लिए - ताकि आप एक ऐसा फ़ंक्शन लिख सकें जो आपको आवश्यक सटीक डेटा निर्यात करता है, या आप कुछ ऐसा लिख सकते हैं जो विभिन्न विकल्पों को तब तक स्वीकार कर सकता है जब तक वे एक सख्त श्वेतसूची से मिलें। आपको दो चीजों की जांच करनी होगी:
- कौन सी फ़ाइलें क्या उपयोगकर्ता को डिस्क पर पढ़ने/लिखने की अनुमति दी जानी चाहिए? उदाहरण के लिए, यह एक विशेष निर्देशिका हो सकती है, और फ़ाइल नाम में एक उपयुक्त उपसर्ग या एक्सटेंशन होना चाहिए।
- कौन सी टेबल क्या उपयोगकर्ता डेटाबेस में पढ़ने/लिखने में सक्षम होना चाहिए? इसे सामान्यतः
GRANT
. द्वारा परिभाषित किया जाएगा डेटाबेस में है, लेकिन फ़ंक्शन अब एक सुपरयुसर के रूप में चल रहा है, इसलिए टेबल जो सामान्य रूप से "सीमा से बाहर" होंगे, पूरी तरह से सुलभ होंगे। आप शायद किसी को आपके फ़ंक्शन को लागू करने और अपनी "उपयोगकर्ता" तालिका के अंत में पंक्तियों को जोड़ने की अनुमति नहीं देना चाहते हैं…
मैंने इस दृष्टिकोण पर विस्तार करते हुए एक ब्लॉग पोस्ट लिखा है, जिसमें कुछ ऐसे कार्यों के उदाहरण शामिल हैं जो सख्त शर्तों को पूरा करने वाली फ़ाइलों और तालिकाओं को निर्यात (या आयात) करते हैं।
ग्राहक पक्ष
दूसरा तरीका यह है कि क्लाइंट की तरफ से फाइल को हैंडल किया जाए , यानी आपके आवेदन या स्क्रिप्ट में। पोस्टग्रेज सर्वर को यह जानने की जरूरत नहीं है कि आप किस फाइल में कॉपी कर रहे हैं, यह सिर्फ डेटा को थूक देता है और क्लाइंट इसे कहीं रख देता है।
इसके लिए अंतर्निहित सिंटैक्स COPY TO STDOUT
. है कमांड, और ग्राफिकल टूल जैसे pgAdmin इसे आपके लिए एक अच्छे डायलॉग में लपेट देगा।
psql
कमांड-लाइन क्लाइंट एक विशेष "मेटा-कमांड" है जिसे \copy
. कहा जाता है , जो "असली" COPY
. के समान सभी विकल्प लेता है , लेकिन क्लाइंट के अंदर चलाया जाता है:
\copy (Select * From foo) To '/tmp/test.csv' With CSV
ध्यान दें कि कोई समाप्ति नहीं है ;
, क्योंकि मेटा-कमांड SQL कमांड के विपरीत, न्यूलाइन द्वारा समाप्त किए जाते हैं।
डॉक्स से:
<ब्लॉकक्वॉट>कॉपी को psql निर्देश \ copy के साथ भ्रमित न करें। \कॉपी एसटीडीआईएन से कॉपी या एसटीडीओयूटी में कॉपी को आमंत्रित करता है, और फिर डेटा को psql क्लाइंट के लिए सुलभ फ़ाइल में प्राप्त/संग्रहित करता है। इस प्रकार, फ़ाइल एक्सेसिबिलिटी और एक्सेस अधिकार सर्वर के बजाय क्लाइंट पर निर्भर करते हैं जब \कॉपी का उपयोग किया जाता है।
आपकी एप्लिकेशन प्रोग्रामिंग भाषा हो सकता है डेटा को आगे बढ़ाने या लाने के लिए भी समर्थन है, लेकिन आप आमतौर पर COPY FROM STDIN
का उपयोग नहीं कर सकते हैं /TO STDOUT
एक मानक SQL कथन के भीतर, क्योंकि इनपुट/आउटपुट स्ट्रीम को जोड़ने का कोई तरीका नहीं है। PHP का PostgreSQL हैंडलर (नहीं PDO) में बहुत ही बुनियादी pg_copy_from
. शामिल है और pg_copy_to
फ़ंक्शन जो PHP सरणी में/से कॉपी करते हैं, जो बड़े डेटा सेट के लिए कुशल नहीं हो सकते हैं।