프로그래밍/Python

쿼리 결과를 dict, json 형태로 한번에 바꾸는 방법

채윤아빠 2021. 5. 19. 12:43
728x90
반응형

RESTful API로 데이터베이스에 특정 조건으로 데이터를 조회한 결과를 JSON 형태로 반환하는 API를 작성하면서, JSON 결과를 만드는 부분을 다음과 같이 일일이 dict 형태로 만들어 주다 보니, 새로운 쿼리를 작성할 때마다 dict 형태로 만들어주는 것 자체도 어려운 것은 아니지만, 의외로 손이 많이 가는 작업이었습니다.

작업중 실수로 오타라도 생기면, 그걸 찾기도 쉽지 않아서 간단하게 데이터베이스 테이블의 컬럼명과 동일한 형태로 결과를 한번에 만들어 주는 것은 없는지 찾아보게 되었습니다.

    query = f"""
SELECT
    M.member_no, M.member_id, '*' AS password, M.member_name, M.phone_no
    , M.email, M.tel_no, M.registration_no, M.descript, M.zip_code
    , M.address1, M.address2, M.company_name, M.ceo_name, M.fax_no
    , M.logo_file_name, M.is_agreement, M.is_3rd, M.is_approved
    , DATE_FORMAT(M.reg_date, '%Y-%m-%d %H:%i:%s') AS reg_date
FROM MEMBER AS M
WHERE 1 = 1
    AND M.member_id = '{member_id}'
;        """

    try:
        cursor.execute(query)
    except:
        return { 'resultCode':500, 'resultMsg': 'query execution fail : member info' }

    row = cursor.fetchone()
    result = {
            'member_no': row[0]
            , 'member_id': row[1]
            , 'password': row[2]
            , 'member_name': row[3]
            , 'phone_no': row[4]
    }

물론 위와 같이 직접 dict를 만들어야 할 경우도 있습니다. dict의 참조키를 컬럼명과 다르게 해야할 경우에는 어쩔 수 없이 직접 지정을 해주어야겠지요.

 

아래와 같이 "for" 문과 "enumerate()" 함수를 이용하면, 단 한줄로 위와 동일하게 dict를 만들 수 있습니다.

    query = f"""
SELECT
    M.member_no, M.member_id, '*' AS password, M.member_name, M.phone_no
    , M.email, M.tel_no, M.registration_no, M.descript, M.zip_code
    , M.address1, M.address2, M.company_name, M.ceo_name, M.fax_no
    , M.logo_file_name, M.is_agreement, M.is_3rd, M.is_approved
    , DATE_FORMAT(M.reg_date, '%Y-%m-%d %H:%i:%s') AS reg_date
FROM MEMBER AS M
WHERE 1 = 1
    AND M.member_id = '{member_id}'
;        """

    try:
        cursor.execute(query)
    except:
        return { 'resultCode':500, 'resultMsg': 'query execution fail : member info' }

    results = [dict((cursor.description[i][0], value) for i, value in enumerate(row)) \
                for row in cursor.fetchall()]

    if results != None and len(results) > 0:
        result = results[0]

dict의 참조키를 테이블의 컬럼명과 다르게 할 경우라도, 위 코드를 그대로 활용하여 dict를 만든 후, 필요한 컬럼들만 추가로 넣어주는 형식으로 코드를 작성하면 조금은 더 수월하게 작성할 수 있지 않을까 합니다.

 

참고 : https://stackoverflow.com/questions/3286525/ ; return SQL table as JSON in python