DictCursor
는 데이터베이스에서 쿼리를 실행한 후 결과를 딕셔너리 형태로 반환해주는 특별한 커서(cursor)입니다.
일반적으로 파이썬에서 데이터베이스(특히 PostgreSQL의 psycopg2
나 MySQL의 pymysql
같은 라이브러리)와 상호작용할 때, cursor.execute()
를 통해 SQL 쿼리를 실행하고 cursor.fetchone()
이나 cursor.fetchall()
등을 사용하여 결과를 가져옵니다.
일반적인 커서의 반환 값:
기본(default) 커서를 사용하면 쿼리 결과의 각 행(row)이 튜플(tuple) 형태로 반환됩니다. 예를 들어, SELECT id, name, email FROM users;
라는 쿼리를 실행하고 fetchone()
하면 (1, 'John Doe', 'john@example.com')
과 같은 튜플을 얻게 됩니다.
이 경우, 특정 컬럼의 값을 얻으려면 인덱스를 사용해야 합니다.
user_data = cursor.fetchone()
user_id = user_data[0]
user_name = user_data[1]
이렇게 하면 컬럼 순서가 바뀌거나 컬럼이 추가/삭제될 때마다 코드도 수정해야 하는 불편함이 있습니다. 또한, 컬럼 이름이 무엇인지 명확하게 드러나지 않아 가독성이 떨어집니다.
DictCursor
의 반환 값:
DictCursor
를 사용하면 쿼리 결과의 각 행이 딕셔너리(dictionary) 형태로 반환됩니다. 이때 딕셔너리의 키(key)는 컬럼 이름이 되고, 값(value)은 해당 컬럼의 데이터가 됩니다.
예를 들어, 위와 동일한 쿼리를 DictCursor
로 실행하고 fetchone()
하면 {'id': 1, 'name': 'John Doe', 'email': 'john@example.com'}
과 같은 딕셔너리를 얻게 됩니다.
이제 컬럼 이름을 사용하여 값을 쉽게 얻을 수 있습니다.
user_data = cursor.fetchone() # {'id': 1, 'name': 'John Doe', 'email': 'john@example.com'}
user_id = user_data['id']
user_name = user_data['name']
이렇게 하면 코드가 훨씬 읽기 쉬워지고, 데이터베이스 스키마(컬럼 순서) 변경에 좀 더 유연하게 대처할 수 있다는 장점이 있습니다.
주요 사용처:
어떻게 사용하나?
파이썬의 데이터베이스 라이브러리(예: psycopg2
for PostgreSQL)에서 커서를 생성할 때 cursor_factory
옵션에 DictCursor
를 지정해줍니다.
import psycopg2
from psycopg2.extras import DictCursor # psycopg2의 경우 extras 모듈에 포함
conn = psycopg2.connect(database="your_db", user="your_user", password="your_password", host="your_host")
# DictCursor를 사용하여 커서 생성
cursor = conn.cursor(cursor_factory=DictCursor)
cursor.execute("SELECT id, name FROM my_table WHERE id = %s;", (1,))
result = cursor.fetchone() # result는 {'id': 1, 'name': 'example'} 형태의 딕셔너리
print(result['name']) # 'example' 출력
cursor.close()
conn.close()
일부 라이브러리에서는 RealDictCursor
와 같이 완벽하게 딕셔너리처럼 동작하면서 인덱스 접근은 지원하지 않는 더 엄격한 딕셔너리 커서도 제공하니, 사용하는 라이브러리의 문서를 참고하는 것이 좋습니다.
결론적으로, DictCursor
는 데이터베이스 쿼리 결과를 다루기 편리하게 딕셔너리 형태로 제공하여 개발 효율성과 코드 가독성을 높여주는 유용한 도구입니다.