createuser permite la creación de un usuario (ROL) en PostgreSQL. Hay una forma sencilla de comprobar si ese usuario(nombre) existe ya? De lo contrario, createuser devuelve un error:

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

ACTUALIZACIÓN: La solución debe ser ejecutable desde shell, preferiblemente, de modo que es más fácil para automatizar dentro de un script.

InformationsquelleAutor m33lky | 2011-12-17

4 Comentarios

  1. 138
    SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'

    Y en términos de línea de comandos (gracias a Erwin):

    psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'"

    Da como resultado 1 si la encuentra y nada más.

    Que es:

    psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'" | grep -q 1 || createuser ...
    • ¿Te acuerdas de lo que es el construido en la utilidad de línea de comandos para ejecutar SQL? Al final prefiero a ejecutar y recuperar el resultado de shell, si es posible.
    • psql es el comando. Pero si estamos hablando de createuser utilidad de línea de comandos (obviamente tiene que hacer, no me di cuenta de la falta de espacio en create user en un principio), entonces puede ser más fácil simplemente ignorar el estado de salida y redirigir la salida a /dev/null.
    • O usted podría poner a prueba el valor de retorno de este comando en el shell (como usuario postgres): psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'". Los rendimientos 1 si lo encuentra y nada más.
    • Jaja, yo sólo lo hizo en un poco más feo de la moda: echo "SELECT rolname FROM pg_roles WHERE rolname='USR_NAME';" | psql | grep -c USR_NAME. Agregar la solución como una respuesta sin «postgres» después de psql.
    • Yo sólo escribí un comentario, porque creo que Michael se merece el crédito de esto. Él contribuyó a la parte principal. Y él ha demostrado ser un buen deporte en el pasado. 🙂 Tal vez Michael quiere incorporar en su respuesta?
    • bueno, para hacer de nosotros, incluso 🙂
    • Aquí va 😉
    • Se recomienda dirigir la salida a /dev/null ;D
    • Me la recomendó devnulling createuser de salida, no psql‘s.

  2. 4

    Siguiendo la misma idea que comprobar si la base de datos existe

    psql -t -c '\du' | cut -d \| -f 1 | grep -qw <user_to_check>

    y se puede utilizar en un script como este:

    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
    • Esto generaría un mayor resultado de la consulta de respuesta stackoverflow.com/a/8546783/107158. Sin embargo, a diferencia de la respuesta, esto se podría sobrevivir a un cambio de nombre para la tabla de sistema pg_roles, pero no un cambio de comando \du. Lo que es más probable que no cambie?
  3. 2

    Espero que esto ayuda a aquellos que puedan estar haciendo esto en python.

    He creado una completa guión de trabajo/solución en un GitHubGist-ver la URL debajo de este fragmento de código.

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

    Proporciona idempotente remoto (RDS) PostgreSQL crear papel/usuario de python sin CM módulos, etc.

  4. 1

    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"

Dejar respuesta

Please enter your comment!
Please enter your name here