प्रतिबंध
आप सिस्टम कैटलॉग से पूछ सकते हैं pg_database
- एक ही डेटाबेस क्लस्टर में किसी भी डेटाबेस से पहुँचा जा सकता है। मुश्किल हिस्सा यह है कि CREATE DATABASE
केवल एक कथन के रूप में निष्पादित किया जा सकता है। मैनुअल:
CREATE DATABASE
लेन-देन ब्लॉक के अंदर निष्पादित नहीं किया जा सकता है।
इसलिए इसे सीधे किसी फंक्शन या DO
. के अंदर नहीं चलाया जा सकता है बयान, जहां यह एक लेनदेन ब्लॉक के अंदर निहित होगा। Postgres 11 के साथ शुरू की गई SQL प्रक्रियाएँ इसमें भी मदद नहीं कर सकती हैं।
psql के भीतर से समाधान
आप सशर्त रूप से DDL स्टेटमेंट को क्रियान्वित करके psql के भीतर से इसके आसपास काम कर सकते हैं:
SELECT 'CREATE DATABASE mydb'
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'mydb')\gexec
मैनुअल:
<ब्लॉकक्वॉट>
\gexec
सर्वर को वर्तमान क्वेरी बफ़र भेजता है, फिर क्वेरी के आउटपुट (यदि कोई हो) की प्रत्येक पंक्ति के प्रत्येक कॉलम को निष्पादित किए जाने वाले SQL कथन के रूप में मानता है।
खोल से समाधान
\gexec
. के साथ आपको केवल psql एक बार पर कॉल करने की आवश्यकता है :
echo "SELECT 'CREATE DATABASE mydb' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'mydb')\gexec" | psql
आपको अपने कनेक्शन के लिए और अधिक psql विकल्पों की आवश्यकता हो सकती है; भूमिका, पोर्ट, पासवर्ड, ... देखें:
- बिना पासवर्ड के psql कमांड के साथ बैच फ़ाइल चलाएँ
इसे psql -c "SELECT ...\gexec"
. के साथ नहीं कहा जा सकता है चूंकि \gexec
एक psql मेटा‑कमांड और -c
. है विकल्प एक कमांड की अपेक्षा करता है जिसके लिए मैनुअल कहता है:
command
या तो एक कमांड स्ट्रिंग होनी चाहिए जो सर्वर द्वारा पूरी तरह से पार्स करने योग्य हो (यानी, इसमें कोई psql- विशिष्ट विशेषताएं नहीं हैं), या एक बैकस्लैश कमांड। इस प्रकार आप SQL और psql मेटा-कमांड को -c
. में नहीं मिला सकते हैं विकल्प।
पोस्टग्रेज लेनदेन के भीतर से समाधान
आप एक dblink
का उपयोग कर सकते हैं वर्तमान डेटाबेस में वापस कनेक्शन, जो लेनदेन ब्लॉक के बाहर चलता है। इसलिए प्रभाव को भी वापस नहीं लाया जा सकता है।
इसके लिए अतिरिक्त मॉड्यूल dblink स्थापित करें (एक बार प्रति डेटाबेस):
- PostgreSQL में dblink का उपयोग (इंस्टॉल) कैसे करें?
फिर:
DO
$do$
BEGIN
IF EXISTS (SELECT FROM pg_database WHERE datname = 'mydb') THEN
RAISE NOTICE 'Database already exists'; -- optional
ELSE
PERFORM dblink_exec('dbname=' || current_database() -- current db
, 'CREATE DATABASE mydb');
END IF;
END
$do$;
फिर से, आपको कनेक्शन के लिए अधिक psql विकल्पों की आवश्यकता हो सकती है। ऑर्टविन का अतिरिक्त उत्तर देखें:
- यदि PostgreSQL के लिए मौजूद नहीं है तो डेटाबेस बनाएं सिमुलेट करें?
dblink के लिए विस्तृत विवरण:
- मैं PostgreSQL में बड़े गैर-अवरुद्ध अपडेट कैसे करूं?
आप इसे बार-बार उपयोग करने के लिए एक फ़ंक्शन बना सकते हैं।