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.