Надеется, что это помогает тем, из вас, кто может это сделать в python.
Я создал полный рабочий сценарий/решение на GitHubGist - см. URL-адрес ниже этого фрагмента кода.
# 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.
Вы помните, что это встроенная утилита командной строки для выполнения SQL? В конце я предпочел бы выполнить и получить результат из оболочки, если это возможно. – m33lky
'psql' - это команда. Но если вы говорите об утилите командной строки 'createuser' (вы, очевидно, делаете это, я не заметил нехватки места в« создании пользователя »), тогда может быть проще просто игнорировать статус выхода и перенаправить вывод на '/ dev/null'. –
@ m33lky: Или вы можете проверить возвращаемое значение этой команды в оболочке (как пользователь postgres): 'psql postgres -tAc" SELECT 1 FROM pg_roles WHERE rolname = 'USR_NAME' "'. Уходит 1, если найдено, и больше ничего. –