आउटपुट स्ट्रीम को नोटिस कैसे प्राप्त करें?


20

मेरे पास फ़ंक्शन में डिबगिंग संदेश हैं। वे संदेश जैसे उठाए जाते हैं

RAISE NOTICE 'Value of id : %', id;

मैंने अपनी लॉग फ़ाइल के साथ सेट किया \o messages.txt

फिर मैं वही करता हूं जो मुझे करने की जरूरत है \i process.sql

और जब निष्पादन समाप्त हो जाता है, \o

समस्या यह है कि मेरे पास मैसेज द्वारा उठाए गए मैसेजेस नहीं हैं। संदेश स्क्रीन पर प्रदर्शित होते हैं लेकिन मैं चाहता हूं कि उन्हें संदेश में लिखा जाए

ऐसा कैसे किया जा सकता था ?

मैंने इस्तेमाल करने की कोशिश की RAISE LOG... और संदेश लॉग फ़ाइल में लिखे गए हैं ... यह वह नहीं है जो मैं चाहता हूं।

मेरे पास एक काम है

plsql -f /path/to/process.sql > messages.txt 2>&1

लेकिन मैं जानना चाहता हूं कि मैं plsql क्लाइंट पर \ i और \ o का उपयोग कैसे कर सकता हूं, जिसमें \ _ में निर्दिष्ट फ़ाइल में संदेश हैं

Cygwin पर मेरा क्लाइंट psql (PostgreSQL) 8.2.11 है और सर्वर संस्करण 9.0.7 है


1
आपकी समस्या का कारण नहीं है, लेकिन Pg 9.0 के खिलाफ Psql 8.2 का उपयोग करने से आपको सिस्टम कैटलॉग स्कीमा परिवर्तन और नए सर्वर सुविधाओं के कारण सभी प्रकार के दुःख हो सकते हैं। यदि आप अजीब या अप्रत्याशित मुद्दों का सामना करते हैं, तो psql 9.x के साथ प्रयास करें।
क्रेग रिंगर

@ क्रैगरिंगर समस्या यह है कि साइबरविन के लिए ग्राहक psql उपलब्ध नहीं है। कम से कम पिछली बार मैंने ग्राहक को साइबरविन पर अपग्रेड करने का प्रयास किया था। मैं \ d कार्यक्षमता का उपयोग नहीं कर सकता, लेकिन बाकी सब ठीक लगता है।
ल्यूक एम।

@CraigRinger को पता नहीं था कि ग्राहक अब समर्थित नहीं था। धन्यवाद।
ल्यूक एम

मैंने अभी डबल चेक किया है कि; मैंने सोचा था कि साइबरविन असमर्थित था और मैंने इसे उम्र के लिए उपयोग करने वाले किसी व्यक्ति के बारे में नहीं सुना था, लेकिन ऐसा लगता है कि लोग अभी भी बिल्डगार्म में साइगविन पर पोस्टग्रेक्यूएल 9.2 बीटा का निर्माण कर रहे हैं ; देख brolga । यह काम करना चाहिए। आप शायद स्रोत से संकलित करना चाहते हैं यदि आप वर्तमान पीजी चाहते हैं, तो यह सिर्फ द्विआधारी Cygwin पैकेज होगा जो कि अप्राप्त हैं। मैं भविष्य की किसी भी उलझन से बचने के लिए उस टिप्पणी को हटा दूंगा।
क्रेग रिंगर

हालांकि सवाल यह है कि: Cygwin का उपयोग क्यों करें psql? libpqमैं समझ सकता हूं कि क्या आपके पास गैर-पोर्टेबल सॉफ्टवेयर है जिसे साइगविन में चलाना है, लेकिन psqlविंडोज के लिए मूल रूप से उपलब्ध होने पर साइगविन पर एक प्राचीन संस्करण चलाने की अपील क्या है?
क्रेग रिंगर

जवाबों:


8

मुझे डर है कि आप इस उत्तर को पसंद नहीं करेंगे, लेकिन वर्तमान में यह असंभव लगता है। से psql प्रलेखन :

फ़ाइल के लिए भविष्य के क्वेरी परिणामों को सहेजता है या कमांड निष्पादित करने के लिए एक अलग यूनिक्स शेल में भविष्य के परिणाम को पाइप करता है। यदि कोई तर्क निर्दिष्ट नहीं किया जाता है, तो क्वेरी आउटपुट मानक आउटपुट पर रीसेट हो जाएगा।

"क्वेरी परिणाम" में डेटाबेस सर्वर से प्राप्त सभी टेबल, कमांड प्रतिक्रियाएं और नोटिस शामिल हैं, साथ ही डेटाबेस को क्वेरी करने वाले विभिन्न बैकस्लैश कमांड (जैसे कि डी डी) का आउटपुट भी है, लेकिन त्रुटि संदेश नहीं।

और जैसा कि आपने देखा, psqlइंटरैक्टिव तरीके से उपयोग करते समय त्रुटि संदेशों को पुनर्निर्देशित करने का कोई तरीका नहीं है ।

(मैं बिना किसी लाभ के \ o से सभी प्रकार के पुनर्निर्देशन के साथ खेल रहा हूं। ऐसा लगता है कि क्वेरी आउटपुट चैनल एक त्रुटि संदेश प्राप्त करने से अलग है - और यहां तक ​​कि सर्वर से त्रुटियां और आपकी प्रक्रियाओं में उठाए गए अलग-अलग तरीके हैं ।

test=# SHOW client_min_messages;
 client_min_messages
---------------------
 notice

-- added the above to show it's not a config problem

CREATE FUNCTION raise_test() RETURNS integer AS
$body$
BEGIN
    RAISE NOTICE 'notice';
    RETURN 1;
END;
$body$
LANGUAGE plpgsql;

test=# \o | cat > out.sql
test=# SELECT raise_test(); -- you could put this in a file and call \i your_file, it's just the same
NOTICE:  notice

test=# \o | cat > out.sql 2>&1
test=# SELECT raise_test();
NOTICE:  notice

out.sql शामिल हैं

 raise_test
------------
          1
(1 row)

दोनों मामलों में। यही कारण है कि मैं इस बात से अवगत हूं कि किसी प्रक्रिया से उठाए गए संदेशों को आउटपुट करने के लिए किस चैनल / फाइल डिस्क्रिप्टर का उपयोग किया जाता है।))

(PostgreSQL-हैकर्स पर एक धागा है जो इस मुद्दे पर कुछ प्रकाश डाल सकता है: http://postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html )

संभवतः जो कर सकता था वह शुरू कर रहा psqlहै

psql test >/tmp/psql.out 2>&1

और यह सभी आउटपुट को निर्दिष्ट फ़ाइल पर रीडायरेक्ट करेगा। इसके साथ एकमात्र समस्या यह है कि आपके पास एक संकेत भी नहीं है, और कमांडलाइन संपादन क्षमताओं को खो दें।


1
नहीं, मुझे आपका जवाब पसंद नहीं है। :-)
ल्यूक एम।

चैनल / फ़ाइल डिस्क्रिप्टर एक प्रक्रिया से उठाए गए संदेशों को आउटपुट करने के लिए उपयोग किया जाता है : यह मानक त्रुटि है। \o | cat > out.sql 2>&1मानक त्रुटि को पुनर्निर्देशित करता है, catलेकिन इनमें से एक भी नहीं है psql, इसलिए यह नोटिस के लिए कोई फायदा नहीं है।
डैनियल वेरिटे

@dezso, कैसे pgAdmin या कोई अन्य GUI उपकरण NOTICEसूचना प्रदर्शित करता है ?
स्पाइक

@ वे psqlकिसी भी मुद्दे के बिना, शायद के शीर्ष पर निर्माण नहीं कर रहे हैं।
dezso

@ जेड्सो, हाँ मुझे मिल गया। मुझे एक मुद्दा मिला, जैसे मैंने अपने सत्र के भीतर सेट client_min_messageकिया है debugऔर ( DOकोई फ़ंक्शन बनाए बिना -) के साथ कुछ गतिशील sqls चलाते हैं , यह pgAdmin में नोटिस उठाता है psql के साथ नहीं। मैंने स्टेटमेंट client_min_messageनिष्पादित करने से पहले मूल्य को प्रिंट किया DO। यह दिखाता है debug, लेकिन संदेश कंसोल में प्रिंट नहीं हो रहा है।
स्पाइक

2

हम \!मेटा कमांड का उपयोग करके सीधे psql से शेल कमांड निष्पादित कर सकते हैं ।

लोकलहोस्ट: 5432 उपयोगकर्ता @ डीबी = # \! psql -U user -h localhost your_database -e 'अपना your_function_name ()'> debug.txt 2> & 1 चुनें

के debug.txtसाथ खुला \e

लोकलहोस्ट: 5432 उपयोगकर्ता @ db = # \ e debug.txt

उठाना संदेश आपके डिफ़ॉल्ट संपादक में दिखाया जाएगा। थोड़ा मुश्किल, अभी भी कमांडलाइन प्रेमी के लिए काफी आसान है।


0

मूल प्रश्न का हल नहीं, बल्कि ओपी के समाधान (जो मेरे काम नहीं आया) के अतिरिक्त


निम्नलिखित के साथ के रूप में upTest.sql

BEGIN;

CREATE FUNCTION count_to_hundred() RETURNS VOID AS
$_$
BEGIN
    FOR i IN 1..100 
    LOOP
        RAISE NOTICE '%', i;
    END LOOP;

    RETURN;
END;
$_$
LANGUAGE plpgsql;


SELECT count_to_hundred();

ROLLBACK;



मुझे यकीन नहीं है, क्यों ओपी में नोट की गई फ़ाइल की तरह आउटपुट लिखना काम नहीं करता है, लेकिन इसे टी में पाइप करना वास्तव में काम करता है:

psql -f raiseTest.sql 2>&1 | tee messages.txt


टी एक या एक से अधिक फ़ाइलों में स्टड लिखते हैं और स्टैडआउट में वापस आ जाते हैं। इसलिए आपके पास आपके कंसोल में और आपके द्वारा प्रदान की गई फ़ाइल में सभी RAISE स्टेटमेंट होंगे। (cf. टी के मैन पेज )


विन्यास:

  • 8.4 पोस्ट करता है
  • साइग्विन 2.0.2
  • ते 8.2.२३ 8.2

सवाल यह था कि NOTICEजब आप इंटरएक्टिव सेशन में आए तब तक मैसेज उठाते रहे और इस्तेमाल किया गया\o
ल्यूक एम

ओह, तुम वहीं हो। मैं पूरी तरह से उस हिस्से को याद कर रहा था, क्योंकि ओपी में वर्कअराउंड मेरे लिए काम नहीं करता था और मैंने केवल इसी पर ध्यान केंद्रित किया था।
फादर स्टैक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.