How to check if a postgres user exists?

前端 未结 4 1675
一生所求
一生所求 2021-01-30 02:04

createuser allows creation of a user (ROLE) in PostgreSQL. Is there a simple way to check if that user(name) exists already? Otherwise createuser returns with an er

相关标签:
4条回答
  • 2021-01-30 02:32

    Hope this helps those of you who might be doing this in python.
    I created a complete working script/solution on a GitHubGist--see URL below this code snippet.

    # ref: https://stackoverflow.com/questions/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: https://stackoverflow.com/questions/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))
    

    Provides idempotent remote (RDS) PostgreSQL create role/user from python without CM modules, etc.

    0 讨论(0)
  • 2021-01-30 02:36
    SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'
    

    And in terms of command line (thanks to Erwin):

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

    Yields 1 if found and nothing else.

    That is:

    psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'" | grep -q 1 || createuser ...
    
    0 讨论(0)
  • 2021-01-30 02:40

    psql -qtA -c "\du USR_NAME" | cut -d "|" -f 1

    [[ -n $(psql -qtA -c "\du ${1}" | cut -d "|" -f 1) ]] && echo "exists" || echo "does not exist"

    0 讨论(0)
  • 2021-01-30 02:50

    Following the same idea than to check if a db exists

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

    and you can use it in a script like this:

    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
    
    0 讨论(0)
提交回复
热议问题