पोस्टग्रेज उपयोगकर्ता मौजूद है तो कैसे जांचें?


89

createuserPostgreSQL में एक उपयोगकर्ता (ROLE) के निर्माण की अनुमति देता है। क्या यह जांचने का एक सरल तरीका है कि क्या उपयोगकर्ता (नाम) पहले से मौजूद है? अन्यथा एक त्रुटि के साथ बनाने वाला रिटर्न:

createuser: creation of new role failed: ERROR:  role "USR_NAME" already exists

अद्यतन: समाधान शेल से बेहतर तरीके से निष्पादन योग्य होना चाहिए, ताकि स्क्रिप्ट के अंदर स्वचालित करना आसान हो।

जवाबों:


161
SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'

और कमांड लाइन (एरविन के लिए धन्यवाद) के संदर्भ में:

psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'"

पैदावार 1 अगर मिला और कुछ नहीं।

अर्थात्:

psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'" | grep -q 1 || createuser ...

क्या आपको याद है कि SQL को निष्पादित करने के लिए अंतर्निहित कमांड-लाइन उपयोगिता क्या है? अंत में यदि संभव हो तो मैं शेल से परिणाम को निष्पादित करना और पुनः प्राप्त करना पसंद करूंगा।
m33lky

1
psqlआज्ञा है। लेकिन अगर आप createuserकमांड लाइन उपयोगिता के बारे में बात कर रहे हैं (आप स्पष्ट रूप से करते हैं, तो मुझे create userपहली बार में जगह की कमी का ध्यान नहीं था ), तो बाहर निकलने की स्थिति को अनदेखा करना और आउटपुट को रीडायरेक्ट करना आसान हो सकता है /dev/null
माइकल क्रेलिन - हैकर

2
@ m33lky: या आप शेल में इस कमांड के रिटर्न मान का परीक्षण कर सकते हैं (जैसा कि उपयोगकर्ता को पोस्टग्रेज करता है) psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'":। पैदावार 1अगर मिली और कुछ नहीं।
एरविन ब्रान्डसेट्टर

1
हाहा, मैंने बस यही किया कि थोड़े और बदसूरत अंदाज में echo "SELECT rolname FROM pg_roles WHERE rolname='USR_NAME';" | psql | grep -c USR_NAME:। Psql के बाद "पोस्टग्रेज" के बिना एक उत्तर के रूप में अपना समाधान जोड़ें।
m33lky

2
@ m33lky: मैंने केवल एक टिप्पणी लिखी है, क्योंकि मुझे लगता है कि माइकल इस पर श्रेय के हकदार हैं। उन्होंने मुख्य भूमिका निभाई। और वह अतीत में एक अच्छा खेल साबित हुआ। :) शायद माइकल अपने जवाब में इसे शामिल करना चाहता है?
इरविन ब्रान्डेसटेटर

5

यदि db मौजूद है, तो जाँच करने के लिए उसी विचार के बाद

psql -t -c '\du' | cut -d \| -f 1 | grep -qw <user_to_check>

और आप इसे इस तरह से एक स्क्रिप्ट में उपयोग कर सकते हैं:

if psql -t -c '\du' | cut -d \| -f 1 | grep -qw <user_to_check>; then
    # user exists
    # $? is 0
else
    # ruh-roh
    # $? is 1
fi

यह उत्तर stackoverflow.com/a/8546783/107158 की तुलना में एक बड़ा क्वेरी परिणाम उत्पन्न करेगा । हालांकि, उस उत्तर के विपरीत, यह एक सिस्टम टेबल पर नाम बदलने से बच जाएगा pg_roles, लेकिन कमांड में कोई बदलाव नहीं \du। सबसे अधिक संभावना है जो नहीं बदलेगा?
डेरेक महार

3

आशा है कि यह आप में से उन लोगों की मदद करता है जो शायद अजगर में ऐसा कर रहे हैं ।
मैंने GitHubGist पर एक पूर्ण कार्य स्क्रिप्ट / समाधान बनाया - इस कोड स्निपेट के नीचे URL देखें।

# ref: /programming/8546759/how-to-check-if-a-postgres-user-exists
check_user_cmd = ("SELECT 1 FROM pg_roles WHERE rolname='%s'" % (deis_app_user))

# our create role/user command and vars
create_user_cmd = ("CREATE ROLE %s WITH LOGIN CREATEDB PASSWORD '%s'" % (deis_app_user, deis_app_passwd))

# ref: /programming/37488175/simplify-database-psycopg2-usage-by-creating-a-module
class RdsCreds():
    def __init__(self):
        self.conn = psycopg2.connect("dbname=%s user=%s host=%s password=%s" % (admin_db_name, admin_db_user, db_host, admin_db_pass))
        self.conn.set_isolation_level(0)
        self.cur = self.conn.cursor()

    def query(self, query):
        self.cur.execute(query)
        return self.cur.rowcount > 0

    def close(self):
        self.cur.close()
        self.conn.close()

db = RdsCreds()
user_exists = db.query(check_user_cmd)

# PostgreSQL currently has no 'create role if not exists'
# So, we only want to create the role/user if not exists 
if (user_exists) is True:
    print("%s user_exists: %s" % (deis_app_user, user_exists))
    print("Idempotent: No credential modifications required. Exiting...")
    db.close()
else:
    print("%s user_exists: %s" % (deis_app_user, user_exists))
    print("Creating %s user now" % (deis_app_user))
    db.query(create_user_cmd)
    user_exists = db.query(check_user_cmd)
    db.close()
    print("%s user_exists: %s" % (deis_app_user, user_exists))

बेरोजगार रिमोट (RDS) प्रदान करता है PostgreSQL सीएम मॉड्यूल, आदि के बिना अजगर से भूमिका / उपयोगकर्ता बनाता है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.