createuser
позволяет создать пользователя (РОЛЬ) в PostgreSQL. Есть ли простой способ проверить, существует ли этот пользователь (имя)? В противном случае createuser вернется с ошибкой:
createuser: creation of new role failed: ERROR: role "USR_NAME" already exists
ОБНОВЛЕНИЕ: решение должно быть исполняемым из оболочки предпочтительно, чтобы его было легче автоматизировать внутри сценария.
postgresql
shell
user-management
m33lky
источник
источник
psql
это команда. Но если вы говорите обcreateuser
утилите командной строки (вы, очевидно, заметили, я сначала не заметил нехватки местаcreate user
), тогда может быть проще просто игнорировать статус выхода и перенаправить вывод в/dev/null
.psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'"
. Урожайность,1
если она найдена, и ничего больше.echo "SELECT rolname FROM pg_roles WHERE rolname='USR_NAME';" | psql | grep -c USR_NAME
. Добавьте свое решение в качестве ответа без "postgres" после psql.Следуя той же идее, чем проверить, существует ли БД
psql -t -c '\du' | cut -d \| -f 1 | grep -qw <user_to_check>
и вы можете использовать его в таком скрипте:
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
источник
pg_roles
, но не при изменении команды\du
. Что, скорее всего, не изменится?Надеюсь, это поможет тем из вас, кто может делать это на python .
Я создал полный рабочий сценарий / решение на GitHubGist - см. URL-адрес ниже этого фрагмента кода.
# ref: /programming/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: /programming/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))
Предоставляет идемпотентный удаленный (RDS) PostgreSQL для создания роли / пользователя из python без модулей CM и т. Д.
источник
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"
источник