psql - कमांड के परिणाम को एक फाइल में सेव करें


283

मैं psql का उपयोग कर रहा हूँ \dt एक डेटाबेस में सभी तालिकाओं को सूचीबद्ध करने लिए और मुझे परिणाम सहेजने की आवश्यकता है।

किसी फ़ाइल में psql कमांड के परिणामों को निर्यात करने के लिए वाक्यविन्यास क्या है?


जवाबों:


478

Psql की मदद से ( \?):

\ o [फ़ाइल] फ़ाइल या पाइप के लिए सभी क्वेरी परिणाम भेजें

आदेशों का क्रम इस तरह दिखेगा:

[wist@scifres ~]$ psql db
Welcome to psql 8.3.6, the PostgreSQL interactive terminal

db=>\o out.txt
db=>\dt
db=>\q

1
क्या मैं इसे \ dt से पहले, या संयोजन में कहूंगा? कृपया वाक्यविन्यास धन्यवाद शामिल करें।
20

118
टंकण \oफिर से इसे बंद कर देता है।
कार्ल जी।

3
अफसोस की बात है कि आउटपुट \?फाइल में नहीं जाता है। :(
ब्लिटज़ेन 9872

अपनी तरह की अनुदार अनुमति के लिए कहा गया है कि व्यवस्थापक के रूप में psql को चलाने का प्रयास करें
Ajay Takur

1
हां, \o queries-output.txtबाद के सभी ओ / पी को पुनर्निर्देशित करता है नामांकित queries-output.txtऔर टाइप करने के लिए \o( psql प्रांप्ट पर फिर से) इस पुनर्निर्देशन व्यवहार को पुनः प्राप्त करता है।
हाईगुल

95

स्तोत्र \o आदेश पहले से ही jhwist द्वारा वर्णित किया गया था।

एक वैकल्पिक दृष्टिकोण COPY TOसर्वर पर एक फाइल पर सीधे लिखने के लिए कमांड का उपयोग कर रहा है। इसका यह लाभ है कि यह आपकी पसंद के आसान-से-पार्स प्रारूप में डंप हो गया है - बजाय Psql के सारणीबद्ध प्रारूप में। किसी अन्य तालिका / डेटाबेस का उपयोग करना भी बहुत आसान हैCOPY FROM

नायब! इसके लिए सुपरसुसर विशेषाधिकारों की आवश्यकता होती है और यह सर्वर पर एक फाइल को लिखेगा ।

उदाहरण: COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';')

';' के साथ CSV फ़ाइल बनाता है क्षेत्र विभाजक के रूप में।

हमेशा की तरह, विवरण के लिए प्रलेखन देखें


मैं मानता हूं @helvete, यहां प्रस्तुत दृष्टिकोण उपयोगकर्ता को अधिक कस्टमाइज़िंग तरीके से आउटपुट कॉन्फ़िगर करने के लिए अधिक शक्ति प्रदान करता है
नाथन बेंटन

27

\copyजो किसी भी उपयोगकर्ता के लिए पोस्टग्रेज कमांड काम कर सकता है। पता नहीं कि यह \ dt के लिए काम करता है या नहीं, लेकिन सामान्य सिंटैक्स को निम्न लिंक से पुन: प्रस्तुत किया जाता है, SQL कॉपी सिंटैक्स पोस्टग्रैट्स

\copy (select * from tempTable limit 100) to 'filenameinquotes' with header delimiter as ','

ऊपर एक csv फ़ाइल के रूप में दिए गए फ़ाइल नाम में चयनित क्वेरी के आउटपुट को सहेजा जाएगा

संपादित करें:

मेरे psql सर्वर के लिए निम्न कमांड काम करता है यह एक पुराना संस्करण v8.5 है

copy (select * from table1) to 'full_path_filename' csv header;

बहुत काम, धन्यवाद। लेकिन 'कॉपी' में '... कॉपी टू ...' की आवश्यकता नहीं है - वास्तव में हाल के संस्करणों पर यह कमांड को विफल करने का कारण बनता है।
टॉम

टॉम, मुझे लगता है कि यह एक टाइपो था। मेरे इंस्टॉलेशन पर काम करने वाले पोस्ट को संपादित करें pgsql 8.5ver
आकाश गुप्ता

जैसा कि मैंने अभी-अभी किया, उसके बाद एक मल्टी-लाइन स्टेटमेंट में पेस्ट करने का प्रयास करने वाले और वाक्यविन्यास त्रुटियों को भ्रमित करने के लिए बस एक त्वरित नोट। आपको एक ही लाइन पर \ copy की तरह जारी रखना होगा।
whoasked

क्या कोई तरीका है कि \ copy को बंद करें? मैंने पाया कि अगर मैं आपके उदाहरण की तरह एक बयान चलाता हूं, और फिर मैं चलाता हूं, उदाहरण के लिए, उपयोगकर्ताओं से * का चयन करें; यह स्क्रीन पर आउटपुट के बजाय मेरे द्वारा निर्दिष्ट सबसे-हाल की फ़ाइल के परिणामों को जोड़ देगा। धन्यवाद।
राफेल 75

6

Pgsql कमांड के o पैरामीटर का उपयोग करें।

-o, --output = FILENAME फ़ाइल (या पाइप) के लिए क्वेरी परिणाम भेजें

psql -d DatabaseName -U UserName -c "SELECT * FROM TABLE" -o /root/Desktop/file.txt

3

COPY tablename TO '/tmp/output.csv' DELIMITER ',' CSV HEADER; इस आदेश का उपयोग संपूर्ण तालिका को सीएसवी के रूप में संग्रहीत करने के लिए किया जाता है


पोस्टग्रुप में डीबी एडमिन की जरूरत से बचने के लिए COPY को रिप्लेस कर दिया जाता है। विंडोज़ में यह फाइल को C: \ tmp
Jan

3

यदि आपको निम्न त्रुटि मिली ufgtoolspg=> COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';') ; ERROR: must be superuser to COPY to or from a file HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

आप इसे इस तरह से चला सकते हैं:

psql somepsqllink_or_credentials -c "COPY (SELECT foo, bar FROM baz) TO STDOUT (format csv, delimiter ';')" > baz.csv


2

सीएसवी फ़ाइल में परिणाम को स्टोर करने के लिए नीचे क्वेरी का उपयोग करें

\ 'फ़ाइल पथ' सीएसवी हेडर के लिए \ कॉपी (आपकी क्वेरी);

उदाहरण

\ copy (सेलेक्ट नाम, डेट_ऑर्डर खरीद_ऑर्डर से) '/home/ankit/Desktop/result.csv' cv हेडर;

आशा है कि यह आपकी मदद करेगा।


1

मुझे लगता है कि इसके लिए कुछ आंतरिक psql कमांड मौजूद है, लेकिन आप scriptकमांड को उपयोग -लिनक्स-एनजी पैकेज से भी चला सकते हैं :

विवरण स्क्रिप्ट आपके टर्मिनल पर छपी हर चीज का एक प्रकार बनाती है।


0

यह दृष्टिकोण किसी भी psql कमांड के साथ सरलतम से सबसे जटिल तक मूल कमांड के किसी भी परिवर्तन या समायोजन की आवश्यकता के बिना काम करेगा

नोट: लिनक्स सर्वर के लिए।


  • अपने कमांड के कंटेंट को फाइल में सेव करें

नमूना

read -r -d '' FILE_CONTENT << 'HEREDOC'
[COMMAND_CONTENT]

HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd

उदाहरण

read -r -d '' FILE_CONTENT << 'HEREDOC'
DO $f$
declare
    curid INT := 0;
    vdata BYTEA;
    badid VARCHAR;
    loc VARCHAR;
begin
FOR badid IN SELECT some_field FROM public.some_base LOOP
    begin
    select 'ctid - '||ctid||'pagenumber - '||(ctid::text::point) [0]::bigint
        into loc
        from public.some_base where some_field = badid;
        SELECT file||' '
        INTO vdata
        FROM public.some_base where some_field = badid;
    exception
        when others then
        raise notice 'Block/PageNumber - % ',loc;
            raise notice 'Corrupted id - % ', badid;
            --return;
    end;
end loop;
end;
$f$;

HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd
  • कमांड चलाएं

नमूना

sudo -u postgres psql [some_db] -c "$(cat sqlcmd)" >>sqlop 2>&1

उदाहरण

sudo -u postgres psql some_db -c "$(cat sqlcmd)" >>sqlop 2>&1

  • अपना कमांड आउटपुट देखें / ट्रैक करें

cat sqlop

किया हुआ! धन्यवाद! = D


0

कर्ता के लिए दृष्टिकोण

psql कमांड के माध्यम से

 docker exec -i %containerid% psql -U %user% -c '\dt' > tables.txt

या sql फ़ाइल से क्वेरी

docker exec -i %containerid% psql -U %user% < file.sql > data.txt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.