How to check if a postgres user exists? How to check if a postgres user exists? postgresql postgresql

How to check if a postgres user exists?


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 ...


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 0else    # ruh-roh    # $? is 1fi


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-existscheck_user_cmd = ("SELECT 1 FROM pg_roles WHERE rolname='%s'" % (deis_app_user))# our create role/user command and varscreate_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-moduleclass 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.