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

जाँच करें कि क्या डेटाबेस शेल का उपयोग करके PostgreSQL में मौजूद है

नोट/अपडेट (2021):जबकि यह उत्तर काम करता है , दार्शनिक रूप से मैं अन्य टिप्पणियों से सहमत हूं कि ऐसा करने का सही तरीका है Postgres से पूछना

जांचें कि क्या अन्य उत्तरों में psql -c . है या --command उनमें आपके उपयोग के मामले के लिए बेहतर फिट हैं (जैसे निकोलस ग्रिली, नाथन उस्मान, ब्रूस या पेड्रो के संस्करण

मैं Arturo के समाधान के निम्नलिखित संशोधन का उपयोग करता हूं:

psql -lqt | cut -d \| -f 1 | grep -qw <db_name>

यह क्या करता है

psql -l निम्न की तरह कुछ आउटपुट करता है:

                                        List of databases
     Name  |   Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
-----------+-----------+----------+------------+------------+-----------------------
 my_db     | my_user   | UTF8     | en_US.UTF8 | en_US.UTF8 | 
 postgres  | postgres  | LATIN1   | en_US      | en_US      | 
 template0 | postgres  | LATIN1   | en_US      | en_US      | =c/postgres          +
           |           |          |            |            | postgres=CTc/postgres
 template1 | postgres  | LATIN1   | en_US      | en_US      | =c/postgres          +
           |           |          |            |            | postgres=CTc/postgres
(4 rows)

भोले दृष्टिकोण का उपयोग करने का मतलब है कि "सूची, "पहुंच" या "पंक्तियों" नामक डेटाबेस की खोज सफल होगी। इसलिए हम इस आउटपुट को केवल पहले कॉलम में खोजने के लिए अंतर्निहित कमांड लाइन टूल के एक समूह के माध्यम से पाइप करते हैं।

-t ध्वज शीर्षलेख और पादलेख हटाता है:

 my_db     | my_user   | UTF8     | en_US.UTF8 | en_US.UTF8 | 
 postgres  | postgres  | LATIN1   | en_US      | en_US      | 
 template0 | postgres  | LATIN1   | en_US      | en_US      | =c/postgres          +
           |           |          |            |            | postgres=CTc/postgres
 template1 | postgres  | LATIN1   | en_US      | en_US      | =c/postgres          +
           |           |          |            |            | postgres=CTc/postgres

अगला बिट, cut -d \| -f 1 आउटपुट को लंबवत पाइप से विभाजित करता है | वर्ण (बैकस्लैश के साथ शेल से बच गया), और फ़ील्ड 1 का चयन करता है। यह छोड़ता है:

 my_db             
 postgres          
 template0         
                   
 template1         
         

grep -w यदि आप temp . की खोज कर रहे हैं तो पूरे शब्दों से मेल खाता है, और इसलिए मेल नहीं खाएगा इस परिदृश्य में। -q विकल्प स्क्रीन पर लिखे गए किसी भी आउटपुट को दबा देता है, इसलिए यदि आप इसे कमांड प्रॉम्प्ट पर अंतःक्रियात्मक रूप से चलाना चाहते हैं तो आप -q को बाहर कर सकते हैं तो कुछ तुरंत प्रदर्शित हो जाता है।

ध्यान दें कि grep -w अल्फ़ान्यूमेरिक, अंक और अंडरस्कोर से मेल खाता है, जो कि पोस्टग्रेस्क्ल में गैर-उद्धृत डेटाबेस नामों में अनुमत वर्णों का सेट है (हाइफ़न गैर-उद्धृत पहचानकर्ताओं में कानूनी नहीं हैं)। यदि आप अन्य वर्णों का उपयोग कर रहे हैं, grep -w आपके लिए काम नहीं करेगा।

इस पूरी पाइपलाइन की निकास स्थिति 0 होगी (सफलता) यदि डेटाबेस मौजूद है या 1 (विफलता) यदि ऐसा नहीं होता है। आपका शेल विशेष चर सेट करेगा $? अंतिम आदेश की निकास स्थिति के लिए। आप सीधे सशर्त में भी स्थिति का परीक्षण कर सकते हैं:

if psql -lqt | cut -d \| -f 1 | grep -qw <db_name>; then
    # database exists
    # $? is 0
else
    # ruh-roh
    # $? is 1
fi


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पिछले 10 दिनों से तारीख के साथ रिकॉर्ड कैसे सूचीबद्ध करें?

  2. PostgreSQL में वेरिएबल कैसे घोषित करें

  3. अद्वितीय डेटाटाइम सीमा के लिए पोस्टग्रेज बाधा

  4. MySQL का HEX () और UNHEX () पोस्टग्रेज में बराबर है?

  5. PostgreSQL 9.1 . में स्वायत्त लेनदेन