PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

यदि PostgreSQL के लिए मौजूद नहीं है तो डेटाबेस बनाएं सिमुलेट करें?

प्रतिबंध

आप सिस्टम कैटलॉग से पूछ सकते हैं 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 में बड़े गैर-अवरुद्ध अपडेट कैसे करूं?

आप इसे बार-बार उपयोग करने के लिए एक फ़ंक्शन बना सकते हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या पोस्टग्रेज में डेटाबेस लेनदेन में संग्रहीत कार्यविधियाँ चलती हैं?

  2. Java JUnit परीक्षण के लिए एंबेडेड PostgreSQL

  3. COUNT कुल में शून्य / 0 परिणाम कैसे शामिल करें?

  4. मैं Postgres 9.3 में वर्तमान समयक्षेत्र का नाम कैसे प्राप्त करूं?

  5. PostgreSQL इंडेक्स बनाएं