2012-12-07 13 views
30

मैं इस तरह मेरे डेटाबेस के खिलाफ स्क्रिप्ट चलाने में के खिलाफ एक एसक्यूएल फ़ाइल को चलाने के स्कीमा ...मैं कैसे Postgresql कमांड लाइन

psql -d myDataBase -a -f myInsertFile.sql 

केवल समस्या यह है कि मैं में निर्दिष्ट करने के लिए सक्षम होना चाहते हैं निर्दिष्ट कर सकते हैं यह आदेश स्क्रिप्ट को स्क्रिप्ट चलाने के लिए किस स्कीमा को चलाने के लिए। मैं set_path = 'my_schema_01' सेट कर सकता हूं लेकिन फ़ाइलों को पोर्टेबल माना जाता है। मैं यह कैसे कर सकता हूँ?

+0

इसे एक रैपर में शामिल करें जो पहले search_path सेट करता है, फिर \ i myInsertFile.sql' करता है? – wildplasser

+1

'PGOPTIONS' पर्यावरण चर को '--search_path = my_schema_01' –

उत्तर

44

आप एक फ़ाइल है कि set schema ... बयान बनाने और उसके बाद कर सकते हैं वास्तविक फ़ाइल शामिल आप चलाना चाहते हैं:

set schema 'my_schema_01'; 
\i myInsertFile.sql 

तब उपयोग करते हुए इस फोन:

psql -d myDataBase -a -f run_insert.sql 

एक फ़ाइल run_insert.sql बनाएं

1

मैं इस तरह कुछ उपयोग कर रहा हूं और बहुत अच्छी तरह से काम करता हूं: * :-)

(echo "set schema 'acme';" ; \ 
    cat ~/git/soluvas-framework/schedule/src/main/resources/org/soluvas/schedule/tables_postgres.sql) \ 
    | psql -Upostgres -hlocalhost quikdo_app_dev 

नोट: लिनक्स/मैक/बैश केवल, शायद वहाँ विंडोज़/PowerShell में भी ऐसा करने के लिए एक रास्ता है, हालांकि।

SET search_path TO myschema; 

ध्यान दें कि set schema myschema उपरोक्त आदेश के लिए एक उपनाम है कि 8.x. में उपलब्ध नहीं है:

29

अधिक सार्वभौमिक रास्ता search_path (PostgreSQL 7.x में और ऊपर काम करना चाहिए) स्थापित करने के लिए है

यह भी देखें: http://www.postgresql.org/docs/9.3/static/ddl-schemas.html

+1

पर सेट करें, मैं इस उत्तर को प्राथमिकता देता हूं, क्योंकि आप एक से अधिक स्कीमा के लिए खोज पथ सेट कर सकते हैं - यदि आप स्कीमा का उपयोग कर रहे हैं तो वे आसान हैं। –

-2

मैं इसी तरह की समस्याओं का सामना करना पड़ रहा था एक मध्यवर्ती स्कीमा पर कुछ Dat आयात (जो बाद में हम अंतिम एक पर चलते) करने के लिए कोशिश कर रहा। चूंकि हम एक्सटेंशन जैसी चीजों पर भरोसा करते हैं (उदाहरण के लिए पोस्टजीआईएस), "run_insert" sql फ़ाइल ने समस्या को पूरी तरह से हल नहीं किया है।

थोड़ी देर के बाद, हमने पाया है कि कम से कम Postgres 9.3 के साथ समाधान काफी आसान है ... बस जब तालिका की चर्चा करते हुए हमेशा स्कीमा निर्दिष्ट करने के लिए अपने SQL स्क्रिप्ट बनाएँ:

CREATE TABLE "my_schema"."my_table" (...); COPY "my_schema"."my_table" (...) FROM stdin;

इस प्रकार psql -f xxxxx का उपयोग पूरी तरह से काम करता है, और आपको search_paths को बदलने की आवश्यकता नहीं है और न ही इंटरमीडिएट फ़ाइलों का उपयोग करने की आवश्यकता है (और विस्तार स्कीमा समस्याओं को नहीं मारा जाएगा)।

23

मुख्य उदाहरण

उदाहरण नीचे डेटाबेस mydatabase पर myfile.sql चलाने स्कीमा myschema का उपयोग कर देगा।

psql "dbname=mydatabase options=--search_path=myschema" -a -f myfile.sql 

तरीका यह काम करता है psql आदेश को पहला तर्क dbname तर्क है। दस्तावेज़ों का उल्लेख connection string प्रदान किया जा सकता है।

इस पैरामीटर एक = चिह्न शामिल है या एक वैध यूआरआई उपसर्ग से प्रारंभ होता है (PostgreSQL: // या postgres: //), यह एक conninfo स्ट्रिंग के रूप में व्यवहार किया जाता है

dbname keyword निर्दिष्ट करता है कनेक्ट करने के लिए डेटाबेस और options keyword आपको कनेक्शन स्टार्टअप पर सर्वर को भेजने के लिए कमांड लाइन विकल्प निर्दिष्ट करने देता है। उन विकल्पों को server configuration chapter में विस्तृत किया गया है। स्कीमा का चयन करने के लिए हम जिस विकल्प का उपयोग कर रहे हैं वह search_path है।

एक और उदाहरण

नीचे दिए गए उदाहरण डेटाबेस पर myhostmydatabase की मेजबानी के लिए स्कीमा myschema का उपयोग कर कनेक्ट करेगा। = विशेष चरित्र एस्केप अनुक्रम %3D से बच निकला होना चाहिए।

psql postgres://[email protected]?options=--search_path%3Dmyschema 
+0

यह वह समाधान है जिसे मैं ढूंढ रहा था, पहले से ही स्कीमा निर्दिष्ट किए बिना बड़ी फ़ाइल बनाई है। – Tregoreg

+0

यह वही है जो मुझे चाहिए - मैं सीधे डेटाबेस से कनेक्ट करने के लिए अपनी मशीन पर उपनाम बनाना चाहता था, search_path सेट करें और यह एक आकर्षण की तरह काम करता है। – lusional

3

PGOPTIONS वातावरण चर एक लचीला तरीका में इस लक्ष्य को हासिल करने के लिए इस्तेमाल किया जा सकता है।

एक यूनिक्स शेल में:

PGOPTIONS="--search_path=my_schema_01" psql -d myDataBase -a -f myInsertFile.sql 

स्क्रिप्ट या उप गोले एक ही विकल्प है कि जरूरत में कई आमंत्रण देखते हैं, तो यह केवल एक बार PGOPTIONS सेट और निर्यात करने के लिए आसान है।

PGOPTIONS="--search_path=my_schema_01" 
export PGOPTIONS 

psql -d somebase 
psql -d someotherbase 
... 

या बाहर

PGOPTIONS="--search_path=my_schema_01" ./my-upgrade-script.sh 

से PGOPTIONS सेट के साथ शीर्ष स्तर के खोल स्क्रिप्ट आह्वान विंडोज अध्यक्ष एवं प्रबंध निदेशक माहौल में, set PGOPTIONS=value एक ही काम करना चाहिए।