postgresql - usuarios - ¿Cómo verificar si existe un usuario postgres?
ver consultas ejecutadas postgresql (3)
Espero que esto ayude a aquellos de ustedes que podrían estar haciendo esto en Python .
Creé una secuencia de comandos / solución de trabajo completa en un GitHubGist; consulte 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))
createuser
permite la creación de un usuario (ROLE) en PostgreSQL. ¿Hay alguna manera simple de verificar si ese usuario (nombre) ya existe? 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 el shell, preferiblemente, para que sea más fácil de automatizar dentro de un script.
Seguir la misma idea que verificar si existe una db
psql -t -c ''/du'' | cut -d /| -f 1 | grep -qw <user_to_check>
y puedes usarlo 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
SELECT 1 FROM pg_roles WHERE rolname=''USR_NAME''
Y en términos de línea de comando (gracias a Erwin):
psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname=''USR_NAME''"
Rinde 1 si se encuentra y nada más.
Es decir:
psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname=''USR_NAME''" | grep -q 1 || createuser ...