94 votes

Comment vérifier si un utilisateur postgres existe ?

createuser permet la création d'un utilisateur (ROLE) dans PostgreSQL. Existe-t-il un moyen simple de vérifier si cet utilisateur (nom) existe déjà ? Sinon, createuser renvoie une erreur :

createuser: creation of new role failed: ERROR:  role "USR_NAME" already exists

MISE À JOUR : La solution devrait être exécutable à partir du shell de préférence, de sorte qu'il est plus facile d'automatiser à l'intérieur d'un script.

167voto

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

0 votes

Vous vous rappelez quel est l'utilitaire de ligne de commande intégré pour exécuter SQL ? En fin de compte, je préfère exécuter et récupérer le résultat à partir du shell si possible.

1 votes

psql est la commande. Mais si vous parlez de createuser (c'est manifestement le cas, je n'ai pas remarqué le manque d'espace dans la ligne de commande). create user au début), il peut être plus simple d'ignorer l'état de sortie et de rediriger la sortie vers /dev/null .

2 votes

@m33lky : Ou vous pourriez tester la valeur de retour de cette commande dans le shell (en tant qu'utilisateur postgres) : psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'" . Rendement 1 s'il est trouvé et rien d'autre.

8voto

matt Points 412

Suivant la même idée que pour 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

0 votes

Cela générerait un résultat de requête plus important que la réponse stackoverflow.com/a/8546783/107158 . Cependant, contrairement à cette réponse, celle-ci survivrait à un renommage de la table système. pg_roles mais pas un changement de commande \du . Laquelle est la plus susceptible de ne pas changer ?

3voto

cmcc Points 51

J'espère que cela aidera ceux d'entre vous qui pourraient faire cela dans python .
J'ai créé une script/solution complète et fonctionnelle sur un GitHubGist - voir l'URL sous cet extrait de code.

# 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))

Fournit un rôle/utilisateur PostgreSQL distant idempotent (RDS) créé à partir de python sans modules CM, etc.

1voto

Pascal Polleunus Points 887

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"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X