createuser
memungkinkan pembuatan pengguna (ROLE) di PostgreSQL. Apakah ada cara sederhana untuk memeriksa apakah pengguna (nama) sudah ada? Jika tidak, createuser kembali dengan kesalahan:
createuser: creation of new role failed: ERROR: role "USR_NAME" already exists
UPDATE: Solusinya sebaiknya dapat dieksekusi dari shell, sehingga lebih mudah untuk mengotomatiskan di dalam skrip.
postgresql
shell
user-management
m33lky.dll
sumber
sumber
psql
adalah perintahnya. Tetapi jika Anda berbicara tentangcreateuser
utilitas baris perintah (Anda jelas melakukannya, saya tidak memperhatikan kurangnya ruangcreate user
pada awalnya), maka mungkin lebih mudah hanya untuk mengabaikan status keluar dan mengarahkan keluaran ke/dev/null
.psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'"
. Hasil1
jika ditemukan dan tidak ada yang lain.echo "SELECT rolname FROM pg_roles WHERE rolname='USR_NAME';" | psql | grep -c USR_NAME
. Tambahkan solusi Anda sebagai jawaban tanpa "postgres" setelah psql.Mengikuti ide yang sama daripada memeriksa apakah db ada
psql -t -c '\du' | cut -d \| -f 1 | grep -qw <user_to_check>
dan Anda dapat menggunakannya dalam skrip seperti ini:
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
sumber
pg_roles
penggantian nama menjadi tabel sistem , tetapi bukan perubahan ke perintah\du
. Mana yang paling mungkin tidak berubah?Semoga ini bisa membantu Anda yang mungkin melakukan ini dengan python .
Saya membuat skrip / solusi yang berfungsi lengkap di GitHubGist - lihat URL di bawah cuplikan kode ini.
# 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))
Menyediakan idempotent remote (RDS) PostgreSQL membuat peran / pengguna dari python tanpa modul CM, dll.
sumber
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"
sumber