Comment vérifier si un utilisateur postgres existe?
   createuser  permet la création d'un utilisateur (rôle) dans PostgreSQL. Est-il un moyen simple pour vérifier si l'utilisateur(nom) existe déjà? Sinon createuser retourne avec une erreur:  
createuser: creation of new role failed: ERROR:  role "USR_NAME" already exists
mise à jour: la solution doit être exécutable à partir de shell de manière préférentielle, de sorte qu'il soit plus facile d'automatiser à l'intérieur d'un script.
3 réponses
SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'
et en termes de ligne de commande (merci à Erwin):
psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'"
Donne 1 si trouvé, et rien d'autre.
C'est-à-dire:
psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'" | grep -q 1 || createuser ...
suivant la même idée que vérifier si un db existe
psql -t -c '\du' | cut -d \| -f 1 | grep -qw <user_to_check>
et vous pouvez l'utiliser dans un script comme ceci:
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
  espérons que cela aide ceux d'entre vous qui pourraient faire cela dans    python    .  
     
J'ai créé un script/solution de travail complet sur un GitHubGist--voir URL ci-dessous ce code snippet.  
# ref: /q/how-to-check-if-a-postgres-user-exists-2073/"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: /q/simplify-database-psycopg2-usage-by-creating-a-module-48199/"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))