কোনও পোস্টগ্রিজ ব্যবহারকারীর উপস্থিতি আছে কিনা তা কীভাবে পরীক্ষা করবেন?


89

createuserPostgreSQL এ একটি ব্যবহারকারী (ROLE) তৈরি করার অনুমতি দেয়। ব্যবহারকারী (নাম) ইতিমধ্যে বিদ্যমান কিনা তা পরীক্ষা করার কোনও সহজ উপায় আছে? অন্যথায় ক্রিয়েটর একটি ত্রুটি সহ ফিরে আসে:

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

আপডেট: সমাধানটি শেল থেকে অগ্রাধিকারযোগ্যভাবে কার্যকর করা উচিত, যাতে কোনও স্ক্রিপ্টের অভ্যন্তরে স্বয়ংক্রিয়ভাবে চালানো সহজ।

উত্তর:


161
SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'

এবং কমান্ড লাইনের পরিপ্রেক্ষিতে (এরউইনকে ধন্যবাদ):

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 ...

আপনার কি মনে আছে এসকিউএল কার্যকর করার জন্য অন্তর্নির্মিত কমান্ড-লাইনটি ইউটিলিটি কী? শেষ পর্যন্ত আমি কার্যকর করতে এবং সম্ভব হলে শেল থেকে ফলাফল পুনরুদ্ধার করতে পছন্দ করব।
m33lky

4
psqlহুকুম হ'ল তবে আপনি যদি createuserকমান্ড লাইন ইউটিলিটি সম্পর্কে কথা বলছেন (আপনি অবশ্যই করেন, আমি create userপ্রথমে জায়গার অভাব লক্ষ্য করিনি ), তবে প্রস্থান স্থিতি উপেক্ষা করা এবং আউটপুটটিকে পুনর্নির্দেশ করা সহজতর হতে পারে /dev/null
মাইকেল ক্রেলিন - হ্যাকার

4
@ এম 33 এলকি: অথবা আপনি শেলটিতে এই কমান্ডের রিটার্ন মানটি পরীক্ষা করতে পারেন (পোস্টগ্রিজ ব্যবহারকারী হিসাবে) : psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'". ফলন 1পাওয়া গেলে আর কিছুই না।
এরউইন ব্র্যান্ডসটেটার

4
হাহা, আমি এটি আরও কিছুটা কুরুচিপূর্ণ ফ্যাশনে করেছি echo "SELECT rolname FROM pg_roles WHERE rolname='USR_NAME';" | psql | grep -c USR_NAME। পিএসকিএল-এর পরে "পোস্টগ্রিস" ছাড়াই উত্তর হিসাবে আপনার সমাধান যুক্ত করুন।
m33lky

4
@ এম 33 এলকি: আমি কেবল একটি মন্তব্য লিখেছিলাম, কারণ আমার মতে মাইকেল এইটির কৃতিত্বের দাবিদার। তিনি মূল অংশটি অবদান রেখেছিলেন। এবং তিনি অতীতে একটি ভাল খেলা হিসাবে প্রমাণিত। :) মাইকেল সম্ভবত এটি তার উত্তর অন্তর্ভুক্ত করতে চান?
এরউইন ব্র্যান্ডসটেটার

5

কোনও ডিবি রয়েছে কিনা তা যাচাই করার চেয়ে একই ধারণা অনুসরণ করা

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

এটি উত্তর স্ট্যাকওভারফ্লো . com/ a/ 8546783/107158 এর চেয়ে আরও বড় কোয়েরি ফলাফল তৈরি করবে । যাইহোক, এই উত্তরটির বিপরীতে, এটি সিস্টেম টেবিলের একটি নতুন নাম থেকে বাঁচতে পারবে pg_roles, তবে কমান্ডে পরিবর্তন হবে না \du। কোনটি সম্ভবত পরিবর্তিত হবে না?
ডেরেক মাহর

3

আশা করি এটি আপনার মধ্যে যারা এই অজগরটি করছেন তারা সম্ভবত সহায়তা করবে ।
আমি একটি গিটহাবজিস্টে একটি সম্পূর্ণ কার্যকারী স্ক্রিপ্ট / সমাধান তৈরি করেছি - এই কোড স্নিপেটের নীচে 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))

সিএম মডিউল ব্যতীত পাইথন থেকে আদর্শগ্রাহী দূরবর্তী (আরডিএস) পোস্টগ্রাইএসকিউএল রোল / ইউজার তৈরির ভূমিকা সরবরাহ করে etc.


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.