파이썬(Python) 오라클(cxOracle) 사용시 쿼리 결과 Dictionary 로 받기
파이썬에서 오라클과 DB 연동을 할때 사용하는 cxOracle 라이브러리는 SELECT 해오는 쿼리 결과가 기본적으로 tuple형태입니다.
('kim', 27, '서울시 광진구')
cs


그러나 이런 형태라면 데이터를 구할때 index를 가지고 다루어야 하므로 나중에 코드를 보았을때 알아보기 힘든 형태가 됩니다.
name = row[0]  #kim
age = row[1]   #27
address = row[2#서울시 광진구
cs



다행히 cxOraclecursor의 rowfactory 라는 메서드를 오버라이딩하여 리턴받는 데이터의 형태를 바꿀 수 있습니다.
#메서드 정의
def makeDictFactory(cursor):
 
   columnNames = [d[0for d in cursor.description]
 
 
   def createRow(*args):
      return dict(zip(columnNames, args))
 
 
   return createRow
 
 
 
#커서의 rowfactory로 지정
cur.rowfactory = makeDictFactory(cur)
 
row = cur.fetchall()
 
 
...생략...
cs



커넥션을 연결하는 것 부터 시작한 예제 코드는 다음과 같습니다.
import cx_Oracle
 
 
 
 
def makeDictFactory(cursor):
   columnNames = [d[0for d in cursor.description]
 
 
   def createRow(*args):
      return dict(zip(columnNames, args))
 
 
   return createRow
 
 
 
 
conn = cx_Oracle.connect("dbuser""dbuserpasswd""localhost/test"#id, passwd, hostname/[sid 또는 servicename]
cur = conn.cursor()
cur.execute("select * from test_tbl where rownum < 2")
 
 
 
 
cur.rowfactory = makeDictFactory(cur)
 
 
rows = cur.fetchall()
 
 
for row in rows :
   print(row)
 
 
conn.close()
cs


리턴되는 데이터는 dictinary 형태이고 그에 따라서 컬럼명을 참조하여 데이터를 얻을 수 있습니다.
{'name': 'kim', 'age': 27, 'address': '서울시 광진구'}
cs


컬럼명 사용
name = row['name']  #kim
age = row['age']   #27
address = row['address'#서울시 광진구
cs




블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!

  • d 2019.07.01 19:23  댓글주소  수정/삭제  댓글쓰기

    안녕하세요

    좋은 글 감사합니다.


    올려주신 자료를 사용하여 데이터를 추출하는 함수를 만들었는데요

    해당 결과가 딕셔너리로 나오지 않고 리스트로 출력됩니다.

    제가 파이썬이 처음인데 함수 출력은 무조건 딕셔너리가 되는것인가요?

    아니면 딕셔너리도 1차원만 적용되는 것인가요?

    (현재 데이터는 2차원 형식으로 출력됩니다.)

    • 도로락 2019.07.09 16:28 신고  댓글주소  수정/삭제

      안녕하세요. 최근 야근으로 인해.. 블로그 관리를 못했습니다.

      2차원형식이든 1차원 형식이든 각 컬럼에 index형식으로 접근하던것을 컬럼명을 key로 해서 접근할 수 있도록 해주는 것 뿐입니다.

      만약 여러 행(row)을 쿼리를 통해 얻어왔다면 여러개의 dict를 담은 list를 리턴받는것이 맞습니다.

      또한 잘 기억나지 않지만 cur.fetchone() 또는 fetchall()에 따라서 리턴되는 결과가 list인지 단일 결과 dict인지 달라졌던것으로 기억하네요.