如何检查一个postgres用户是否存在?

createuser允许在PostgreSQL中创build一个用户(ROLE)。 有没有简单的方法来检查用户(名称)是否已经存在? 否则createuser返回一个错误:

 createuser: creation of new role failed: ERROR: role "USR_NAME" already exists 

更新:解决scheme应该可以从shell执行,因此脚本内部的自动化更容易。

 SELECT 1 FROM pg_roles WHERE rolname='USR_NAME' 

而在命令行方面(感谢Erwin):

 psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'" 

如果find则产生1,没有其他的。

那是:

 psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'" | grep -q 1 || createuser ... 

遵循相同的想法,而不是检查一个数据库是否存在

 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 

希望这可以帮助那些可能在python中做到这一点的人。
我在GitHubGist上创build了一个完整的工作脚本/解决scheme – 请参阅此代码段下面的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)) 

提供幂等远程(RDS)PostgreSQL创buildangular色/用户从python没有CM模块等