>source

파이썬을 사용하여 postgresql 서버 사용자/역할을 만들고 있습니다. 이 조건에서 사용자가 이미 종료하면 인쇄 오류를 의미하고, 존재하지 않으면 postgres에서 사용자/역할을 생성 함을 의미합니다. 나는 작동하지 않는 코드 아래에서 시도했습니다. 동일한 방식으로 DB 생성을 달성했습니다. 제안을 요청하십시오.

import psycopg2
from psycopg2 import sql
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
## root user connection
def userCreation():    
    con = psycopg2.connect(
          user='root', host='127.0.0.1', port = '5432', 
          password='root')
    con.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
    cur = con.cursor()
    ## New User/Role Creation
    try:
        username = input("Enter User Name : ")
        pwd = input("Enter Password : ")
        cur.execute(sql.SQL("SELECT FROM pg_catalog.pg_roles WHERE  rolname = "+username+";").format(sql))
        print ("User Already Exist..!")
    except:
        cur.execute(sql.SQL("CREATE ROLE"+username+"  LOGIN PASSWORD"+pwd+";").format(sql))
        print ("DB User has been created Successfully ..!")

  • 답변 # 1

    나는 이것이 당신을 위해 트릭을 할 것이라고 생각합니다.

    베어 사용하지 마십시오 except: , 이제 모든 예외를 숨 깁니다.

    쿼리 결과를보고 행이 반환되었는지 확인합니다.

    사용하려는 경우 psycopg2.SQL() 쿼리를 작성하려면 올바르게 사용해야합니다.

    이러한 오용으로 인해 코드가 SQL 주입 공격에 취약했습니다.

    import psycopg2
    from psycopg2 import sql
    
    def prompt_username(con):
        cur = con.cursor()
        while True:
            username = input("Enter User Name : ")
            cur.execute("SELECT COUNT(*) FROM pg_catalog.pg_roles WHERE rolname = %s", [username])
            n, = cur.fetchone()
            if n == 0:
                return username
            print("User already exists.")
    
    def userCreation():
        con = psycopg2.connect(
            user='postgres',
            host='127.0.0.1',
            port='5432',
            password='',
        )
        username = prompt_username(con)
        password = input(f"Enter Password for {username} : ")
        query = sql.SQL("CREATE ROLE {0} LOGIN PASSWORD {1}").format(
            sql.Identifier(username),
            sql.Literal(password),
        )
        cur = con.cursor()
        cur.execute(query.as_string(con))
        cur.execute("COMMIT")
    
    if __name__ == '__main__':
        userCreation()
    
    

관련 자료

  • 이전 java - 스트림에서 여러 목록을 하나의 객체 목록으로 병합 하시겠습니까?
  • 다음 java - 계산기 앱에서 DecimalFormat 오류를 해결하는 방법