2011-12-17 60 views
70

createuser cho phép tạo người dùng (ROLE) trong PostgreSQL. Có cách nào đơn giản để kiểm tra xem người dùng (tên) đó đã tồn tại chưa? Nếu không, người tạo tạo trả về với một lỗi:Làm cách nào để kiểm tra xem người dùng postgres có tồn tại không?

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

CẬP NHẬT: Giải pháp nên được thực thi từ vỏ tốt hơn, để dễ dàng tự động hóa bên trong tập lệnh.

Trả lời

121
SELECT 1 FROM pg_roles WHERE rolname='USR_NAME' 

Và về dòng lệnh (nhờ Erwin):

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

Sản lượng 1 nếu tìm thấy và không có gì khác.

Đó là:

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

Bạn có nhớ được xây dựng trong tiện ích dòng lệnh để thực hiện SQL là gì? Cuối cùng tôi muốn thực hiện và lấy kết quả từ trình bao nếu có thể. – m33lky

+1

'psql' là lệnh. Nhưng nếu bạn đang nói về tiện ích dòng lệnh 'createuser' (bạn rõ ràng là vậy, tôi không nhận thấy thiếu không gian trong' tạo user' lúc đầu), thì có thể dễ dàng bỏ qua trạng thái thoát và đầu ra chuyển hướng thành '/ dev/null'. –

+2

@ m33lky: Hoặc bạn có thể kiểm tra giá trị trả lại của lệnh này trong shell (như người dùng postgres): 'psql postgres -tAc" SELECT 1 FROM pg_roles WHERE rolname = 'USR_NAME' "'. Lợi nhuận '1' nếu tìm thấy và không có gì khác. –

3

Tiếp nối ý tưởng tương tự hơn để check if a db exists

psql -t -c '\du' | cut -d \| -f 1 | grep -qw <user_to_check> 

và bạn có thể sử dụng nó trong một kịch bản như thế này:

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 
+0

Điều này sẽ tạo ra một kết quả truy vấn lớn hơn câu trả lời http://stackoverflow.com/a/8546783/107158. Tuy nhiên, không giống như câu trả lời đó, câu lệnh này sẽ tồn tại đổi tên thành bảng hệ thống 'pg_roles', nhưng không thay đổi thành lệnh' \ du'. Có nhiều khả năng là không thay đổi? –

2

Hope this helps những của những người có thể làm điều này trong python.
Tôi đã tạo một tập lệnh/giải pháp làm việc hoàn chỉnh trên GitHubGist - xem URL bên dưới đoạn mã này.

# 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)) 

Provides idempotent remote (RDS) PostgreSQL create role/user from python without CM modules, etc.

Các vấn đề liên quan