createuser
umożliwia utworzenie użytkownika (ROLA) w PostgreSQL. Czy istnieje prosty sposób sprawdzenia, czy ten użytkownik (nazwa) już istnieje? W przeciwnym razie createuser zwraca z błędem:
createuser: creation of new role failed: ERROR: role "USR_NAME" already exists
AKTUALIZACJA: Rozwiązanie powinno być najlepiej wykonywalne z powłoki, aby łatwiej było zautomatyzować wewnątrz skryptu.
postgresql
shell
user-management
m33lky
źródło
źródło
psql
jest rozkazem. Ale jeśli mówisz ocreateuser
narzędziu wiersza poleceń (oczywiście robisz, na początku nie zauważyłem braku miejscacreate user
), może być łatwiej po prostu zignorować stan wyjścia i przekierować dane wyjściowe do/dev/null
.psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'"
. Plony,1
jeśli zostaną znalezione i nic więcej.echo "SELECT rolname FROM pg_roles WHERE rolname='USR_NAME';" | psql | grep -c USR_NAME
. Dodaj swoje rozwiązanie jako odpowiedź bez "postgres" po psql.Idąc tym samym pomysłem, co sprawdzić, czy baza danych istnieje
psql -t -c '\du' | cut -d \| -f 1 | grep -qw <user_to_check>
i możesz go użyć w skrypcie takim jak ten:
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
źródło
pg_roles
, ale nie zmianę polecenia\du
. Co najprawdopodobniej się nie zmieni?Mam nadzieję, że pomoże to tym z was, którzy mogą to robić w Pythonie .
Stworzyłem kompletny działający skrypt / rozwiązanie na GitHubGist - zobacz adres URL poniżej tego fragmentu kodu.
# 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))
Zapewnia idempotentne zdalne (RDS) tworzenie roli / użytkownika PostgreSQL z Pythona bez modułów CM itp.
źródło
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"
źródło