Esperanza esto ayuda a las personas de usted que podría estar haciendo esto en python.
Creé una secuencia de comandos/solución 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))
Provides idempotent remote (RDS) PostgreSQL create role/user from python without CM modules, etc.
¿Recuerdas cuál es el SQL incorporado en la utilidad de línea de comandos para ejecutar? Al final, preferiría ejecutar y recuperar el resultado del shell si fuera posible. – m33lky
'psql' es el comando. Pero si estás hablando de la utilidad de línea de comandos 'createuser' (obviamente lo haces, no noté la falta de espacio en' create user' al principio), entonces puede ser más fácil simplemente ignorar el estado de salida y redirigir la salida a '/ dev/null'. –
@ m33lky: O puede probar el valor de retorno de este comando en el shell (como usuario de postgres): 'psql postgres -tAc" SELECCIONAR 1 FROM pg_roles DONDE rolname = 'USR_NAME' "'. Otorga '1' si se encuentra y nada más. –