How to check if a postgres user exists?

前端 未结 4 1682
一生所求
一生所求 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.

提交回复
热议问题