티스토리 뷰
반응형
🚀 들어가며...
- 이번 포스팅에서는 postgresql에서 cursor.execute로 쿼리를 실행한 결과를 json 형식으로 만들어 반환해주는 방법에 대해 소개해보도록 하겠습니다.
📑 내용
저같은 경우에는 리스트안에 딕셔너리 형태로 표현을 하였고, cursor.description을 이용하여 쿼리결과의 컬럼값들을 뽑은 후 만들고자 하는 딕셔너리형식의 키값으로 넣어주고, cursor.fetchall()을 이용하여 나온 결과값을 딕셔너리의 벨류값으로 넣어줘서 최종적으로는 원하는 결과를 Json형식으로 만들어줍니다.
def name_to_json(cursor):
"""
cursor.fetchall() 함수로 받아온 쿼리 결과를 json 형식으로 만들어 반환해주는 함수입니다.
:param cursor: SQL 연결 변수
:return: JSON 쿼리 결과 LIST
"""
row = [dict((cursor.description[i][0], value)
for i, value in enumerate(row)) for row in cursor.fetchall()]
return row
위에 기본 코드에서 추후 결과값을 컬럼순으로 정렬하여 리턴값을 보내고 싶거나 키값을 대문자로 리턴을 해주고 싶을 경우 및 빈값을 리턴해주기를 원할경우를 대비하여 bsort, bUpper, empty를 인자로 받아서 그에 맞게 처리해줄수 있도록 함수를 가공해보았습니다.
def name_to_json(cursor, empty=False, bsort=False, bUpper=False):
"""
cursor.fetchall() 함수로 받아온 쿼리 결과를 json 형식으로 만들어 반환해주는 함수입니다.
:param cursor: SQL 연결 변수
:return: JSON 쿼리 결과 LIST
"""
if bsort:
dic = OrderedDict()
else:
dic = {}
row = []
if cursor.rowcount > 0 :
if bsort:
row = [OrderedDict((cursor.description[i][0].upper() if bUpper == True else cursor.description[i][0], value)
for i, value in enumerate(row)) for row in cursor.fetchall()]
else:
row = [dict((cursor.description[i][0].upper() if bUpper == True else cursor.description[i][0], value)
for i, value in enumerate(row)) for row in cursor.fetchall()]
else:
if empty:
for col in cursor.description:
dic[col.name.upper() if bUpper == True else col.name] = None
row.append(dic.copy())
return row
백개발자 로써 속도개선 및 대용량데이터 처리는 중요한 부분이라고 생각합니다. 데이터가 많다면 그만큼 속도는 오래걸리기 마련입니다.
데이터가 10만건 있다고 가정해보면, 위에 코드에서는 description을 10만번 돕니다. 함수 특성상 한번만 돌면 되는것이 불필요하게 여러번 돈다고 판단하여 대용량데이터 버전으로 함수를 튜닝해보았습니다.
def name_to_json_large(cursor, empty=False, bUpper=False, request=None):
"""
cursor.fetchall() 함수로 받아온 쿼리 결과를 json 형식으로 만들어 반환해주는 함수입니다. 대량데이터 조회시 사용
#######################################################
####### 결과 데이터가 json 으로 넘어오는 경우에는 사용 불가 #######
#######################################################
:param cursor: SQL 연결 변수
:return: JSON 쿼리 결과 LIST
"""
row = []
de = None
if request:
de = CryptHelper(request)
if cursor.rowcount > 0:
if bUpper:
col_infos = [x[0].upper() for x in cursor.description]
else:
col_infos = [x[0] for x in cursor.description]
if de:
row = [{col_infos[i]: de.decrypt_social(value) if col_infos[i].endswith('no_social') else value for i, value in enumerate(row)} for row in cursor.fetchall()]
else:
row = [{col_infos[i]: value for i, value in enumerate(row)} for row in cursor.fetchall()]
else:
if empty:
dic = {}
for col in cursor.description:
dic[col.name.upper() if bUpper else col.name] = None
row.append(dic.copy())
return row
🙋🏻♂️ 후기
함수 하나를 만들면서 여러 깊은 고민들을 해보는 과정이 좋았습니다. 사소할순 있지만 이러한 생각들이 저의 개발자로써 더 넓은 시야로 인도해줄거라 믿어 의심치 않습니다. 오늘도 화이팅입니다~!
반응형
'Python' 카테고리의 다른 글
[python] List Comprehension & Generator (0) | 2022.08.22 |
---|---|
[python] 언더스코어(_, __) 에 대해 알아보자! (0) | 2022.06.27 |
[python] list 정렬시 특징 정리 (0) | 2022.05.24 |
[python] mutable, immutable 그리고 복사 (0) | 2022.05.23 |
[Python] 파이썬에서 json모듈 다루는 방법 (0) | 2022.05.12 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Greedy Algorithm
- list
- docker
- Algorithm
- django ORM
- react
- ORM
- lv1
- PostgreSQL
- JavaScript
- container
- Python
- static files
- lv2
- union-find
- Linux
- SQL
- Named export
- programmers
- generator expression
- db
- data formatting
- 탐욕법
- Master & Slave
- Default export
- django
- uSWGI
- This
- MVT
- JS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함