createuser
PostgreSQLでユーザー(ROLE)を作成できます。そのユーザー(名前)がすでに存在するかどうかを確認する簡単な方法はありますか?それ以外の場合、createuserはエラーを返します。
createuser: creation of new role failed: ERROR: role "USR_NAME" already exists
更新:ソリューションは、スクリプト内で自動化するのが簡単になるように、シェルから実行可能にする必要があります。
回答:
SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'
そして、コマンドラインの観点から(Erwinに感謝):
psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'"
見つかった場合は1、それ以外はなし。
あれは:
psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'" | grep -q 1 || createuser ...
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
。psqlの後に「postgres」を付けずにソリューションを回答として追加します。
データベースが存在するかどうかを確認するのと同じ考えに従う
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))