PostgreSQL: कमांड लाइन से पैरामीटर कैसे पास करें?


92

मेरे पास स्क्रिप्ट में कुछ विस्तृत क्वेरी है जो ?प्लेसहोल्डर्स का उपयोग करती है । मैं psql कमांड लाइन (स्क्रिप्ट के बाहर) से सीधे इसी क्वेरी का परीक्षण करना चाहता था। मैं ?वास्तविक मूल्यों के साथ सभी को बदलने और बदलने से बचना चाहता हूं , इसके बजाय मैं क्वेरी के बाद तर्क पारित करना चाहता हूं।

उदाहरण:

SELECT  * 
FROM    foobar
WHERE   foo = ?
   AND  bar = ?
    OR  baz = ?  ;

कुछ इस तरह की तलाश में:

%> {select * from foobar where foo=? and bar=? or baz=? , 'foo','bar','baz' };

अधिक संदर्भ, कृपया। क्या यह क्वेरी SQL फ़ाइल में, Perl / Python / Ruby / <पसंदीदा स्क्रिप्टिंग भाषा को यहाँ> स्क्रिप्ट, या किसी अन्य स्थान पर डालें?

@ जैक: मैं सीधे psql प्रॉम्प्ट (कमांड लाइन) से ऐसा करना चाह रहा हूं। मैं एक स्क्रिप्ट से अपना कोड ले रहा हूं, लेकिन पूरी खोज / प्रतिस्थापन प्रक्रिया से नहीं जाना चाहता।
Vol7ron

@ Vol7ron, कृपया psql कमांड लाइन उदाहरण के लिए नीचे मेरा जवाब देखें।
MAbraham1

1
@ MAbraham1: अच्छा। मुझे अपने प्रश्न के लिए कुछ और पृष्ठभूमि देनी चाहिए थी। मेरे पास बहुत सारी स्क्रिप्ट हैं जिनमें ओपन टेक्स्ट में SQL है। कभी-कभी इसे लेने के लिए उपयोगी और डिबगिंग के लिए कस्टम मान के साथ सीधे डेटाबेस के खिलाफ उन लोगों को मारा। मैं आसानी से अतिरिक्त फ़ाइलों को बचाने के लिए w / o की जरूरत के अंदर इसे करने के लिए एक रास्ता तलाश रहा था।
Vol7ron

@ Vol7ron, धन्यवाद। मैं बैच की नौकरियों के संदर्भ में सोच रहा था, हालांकि आपको खुले SQL में टोकन का उपयोग करने में सक्षम होना चाहिए, साथ ही साथ। अगर आपको मेरा जवाब पसंद आया तो वोट देना न भूलें।
MAbraham1

जवाबों:


178

आप -v निर्माण जैसे उपयोग कर सकते हैं

psql -v v1=12  -v v2="'Hello World'" -v v3="'2010-11-12'"

और फिर sql में वेरिएबल्स को देखें: v1,: v2 आदि

select * from table_1 where id = :v1;

कृपया ध्यान दें कि हम दो उद्धरणों का उपयोग करके स्ट्रिंग / दिनांक मान कैसे पास करते हैं " '...' "


2
+1 रुचिकर, नामांकित तर्क। क्या आप एक बार लॉग इन करने के लिए किसी भी तरह से जानते हैं?
Vol7ron

9
ज़रूर, बस उपयोग करें \set v3 'another value'। बस याद रखें, जब आपको SQL कथन में मान को उद्धृत करने की आवश्यकता होती है, तो चर नाम के चारों ओर एपोस्ट्रोफ का उपयोग करें, जैसे:SELECT * FROM foo WHERE bar = :'v3';
7

1
मुझे लगता है कि वे मिल गएawk
नील मैकगिन

1
के बजाय इस्तेमाल किया जा सकता है: sqlserver की तरह
Awais महमूद

4
ध्यान दें, इसे पढ़ने के बाद मुझे उम्मीद थी कि -v के साथ सेट किए गए चर -c के साथ निष्पादित कमांड के लिए उपलब्ध होंगे, लेकिन, अफसोस कि वे नहीं हैं। दूसरे शब्दों में, psql -v v1=12 -v v2="'Hello World'" -v v3="'2010-11-12'" -c 'select * from table_1 where id = :v1;' एक सिंटैक्स त्रुटि उत्पन्न करेगा। हालांकि, अगर बैश आपका शेल है, तो आप कोशिश कर सकते हैं: psql -v v1=12 -v v2="'Hello World'" -v v3="'2010-11-12'" <<< 'select * from table_1 where id = :v1;' अच्छे प्रभाव के लिए।
malcook

30

PostgreSQL में पता चला, आप एक स्क्रिप्टिंग भाषा में जैसे आप कर सकते हैं वैसे ही PREPAREबयान कर सकते हैं। दुर्भाग्य से, आप अभी भी उपयोग नहीं कर सकते हैं ?, लेकिन आप $nसंकेतन का उपयोग कर सकते हैं ।

उपरोक्त उदाहरण का उपयोग करना:

PREPARE foo(text,text,text) AS
    SELECT  * 
    FROM    foobar
    WHERE   foo = $1
       AND  bar = $2
        OR  baz = $3  ;
EXECUTE foo('foo','bar','baz');
DEALLOCATE foo;

@IvanBlack कुछ और था जिसे आप उस के साथ शामिल करना चाहते थे? :)
निपटारा

बस ध्यान दें कि अब fooव्यस्त है और एक PREPAREऔर नाम होना चाहिए जबकि वर्तमान सत्र बंद नहीं है। आप के साथ खेलते हैं तो PREPAREमें psqlयह एक नया नाम हर बार आविष्कार करने के लिए मुश्किल है और DEALLOCATEइसके साथ मदद कर सकते हैं =)
इवान काले

इसका उल्लेख करने के लिए धन्यवाद। मैंने कुछ समय में
PREPARE का

यह समाधान IMO बहुत अच्छा है। एक उपयोगी साइड इफेक्ट - आप आसानी से तैयार स्टेटमेंट को कई बार कॉल कर सकते हैं।
यूरी

13

Psql में इसके माध्यम से एक तंत्र है

\set name val

कमांड, जिसे -v name=valकमांड-लाइन विकल्प से बंधा होना चाहिए । उद्धरण दर्दनाक है, ज्यादातर मामलों में पूरे क्वेरी मांस को एक शेल-दस्तावेज़ के अंदर रखना आसान है।

संपादित करें

ओह, मुझे -vइसके बजाय कहना चाहिए था -P(जो विकल्पों को स्वरूपित करने के लिए है) पिछले उत्तर ने इसे सही पाया।


7

आप psql कमांड-लाइन पर या बैच फ़ाइल से पैरामीटर भी पास कर सकते हैं। आपके डेटाबेस से जुड़ने के लिए पहले विवरण आवश्यक विवरण एकत्र करते हैं।

अंतिम संकेत बाधा मानों के लिए पूछता है, जिसका उपयोग WHERE कॉलम IN () क्लॉज में किया जाएगा। एकल-उद्धरण को याद रखें यदि तार, और अल्पविराम द्वारा अलग हैं:

@echo off
echo "Test for Passing Params to PGSQL"
SET server=localhost
SET /P server="Server [%server%]: "

SET database=amedatamodel
SET /P database="Database [%database%]: "

SET port=5432
SET /P port="Port [%port%]: "

SET username=postgres
SET /P username="Username [%username%]: "

SET /P bunos="Enter multiple constraint values for IN clause [%constraints%]: "
ECHO you typed %constraints%
PAUSE
REM pause
"C:\Program Files\PostgreSQL\9.0\bin\psql.exe" -h %server% -U %username% -d %database% -p %port% -e -v v1=%constraints% -f test.sql

अब आपकी SQL कोड फ़ाइल में, अपने WHERE क्लॉज़ में, या SQL में कहीं भी v1 टोकन जोड़ें। ध्यान दें कि टोकन एक खुले SQL कथन में भी इस्तेमाल किया जा सकता है, न कि केवल एक फ़ाइल में। इसे test के रूप में सहेजें। sql:

SELECT * FROM myTable
WHERE NOT someColumn IN (:v1);

Windows में, पूरी फ़ाइल को DOS BATch फ़ाइल (.bat) के रूप में सहेजें, उसी निर्देशिका में test.sql को सहेजें और बैच फ़ाइल लॉन्च करें।

मूल संकेतित स्क्रिप्ट के लिए, एंटरप्राइज़ डीबी के डेव पेज के लिए धन्यवाद।


विंडोज उदाहरण के लिए +1; हालांकि अधिकांश पीजी डेटाबेस एक * निक्स संस्करण में मौजूद हैं
vol7ron

2

ऐसा प्रतीत होता है कि आप जो पूछते हैं वह सीधे कमांड लाइन से नहीं किया जा सकता है । आपको या तो plpgsql में उपयोगकर्ता-परिभाषित फ़ंक्शन का उपयोग करना होगा या स्क्रिप्टिंग भाषा से क्वेरी को कॉल करना होगा (और बाद का दृष्टिकोण SQL इंजेक्शन से बचने के लिए थोड़ा आसान बनाता है)।


क्या मैं नहीं था - कई बार मैं चाहता हूं कि डाउनवोट्स को कुछ प्रकार के स्पष्टीकरण की आवश्यकता होनी चाहिए (इसी तरह के कारणों से हम करीबी सवालों को वोट करते हैं), भले ही गुमनाम रूप से छोड़ दिया जाए।
Vol7ron
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.