[Python] fetchone()으로 SQL 쿼리 결과 한 줄씩 읽기

Sue·2025년 6월 4일
0
post-thumbnail

fetchone()은 데이터베이스 커서(cursor) 객체의 메서드 중 하나로, SQL 쿼리 실행 결과에서 단 한 개의 행(row)을 가져올 때 사용됩니다.

이전에 설명했던 DictCursor를 사용했다면, fetchone()의 결과는 딕셔너리 형태의 단일 행이 될 것이고, 일반 커서를 사용했다면 튜플 형태의 단일 행이 될 것입니다.

fetchone()의 특징 및 동작 방식:

  • 단일 행 반환: fetchone()은 쿼리 결과 집합에서 다음 사용 가능한 행 하나만 반환합니다.
  • 커서의 위치 이동: fetchone()을 호출할 때마다 커서의 내부 포인터가 다음 행으로 이동합니다. 즉, 여러 번 호출하면 결과 집합의 다음 행, 그 다음 행을 순차적으로 가져옵니다.
  • 결과가 없을 때 None 반환: 더 이상 가져올 행이 없으면 None을 반환합니다. 이 특징은 주로 while 반복문과 함께 사용하여 모든 행을 순회할 때 유용합니다.
  • SELECT 쿼리에서 사용: 주로 데이터를 조회하는 SELECT 쿼리를 실행한 후에 결과를 가져올 때 사용됩니다. INSERT, UPDATE, DELETE와 같은 DML(Data Manipulation Language) 쿼리는 보통 결과를 반환하지 않으므로 fetchone()을 사용할 필요가 없습니다.

예시:

import psycopg2
from psycopg2.extras import DictCursor # DictCursor를 사용한다고 가정

# 데이터베이스 연결 (예시)
conn = psycopg2.connect(
    database="my_db",
    user="user",
    password="password",
    host="localhost",
    port="5432"
)

# DictCursor 생성
cursor = conn.cursor(cursor_factory=DictCursor)

# 쿼리 실행 (users 테이블에서 모든 사용자 조회)
cursor.execute("SELECT id, name, email FROM users;")

# 첫 번째 행 가져오기
first_user = cursor.fetchone()
if first_user:
    print("첫 번째 사용자:", first_user) # {'id': 1, 'name': 'Alice', 'email': 'alice@example.com'}
    print("사용자 이름:", first_user['name']) # Alice
else:
    print("가져올 사용자가 없습니다.")

# 두 번째 행 가져오기 (커서가 다음 위치로 이동했으므로)
second_user = cursor.fetchone()
if second_user:
    print("두 번째 사용자:", second_user) # {'id': 2, 'name': 'Bob', 'email': 'bob@example.com'}
else:
    print("두 번째 사용자가 없습니다.")

# 더 이상 행이 없을 때
third_user = cursor.fetchone() # 더 이상 행이 없으면 None 반환
if third_user is None:
    print("더 이상 가져올 사용자가 없습니다. (None 반환 확인)")

cursor.close()
conn.close()

fetchone()과 fetchall(), fetchmany() 비교:

  • fetchone(): 쿼리 결과에서 한 번에 하나의 행만 가져옵니다.
  • 커서의 위치를 다음 행으로 이동시킵니다.
  • fetchall(): 쿼리 결과의 남아있는 모든 행을 리스트 형태로 가져옵니다. (예: [{'id': 1, 'name': 'A'}, {'id': 2, 'name': 'B'}]) 한 번 호출하면 커서가 결과 집합의 끝으로 이동합니다.
  • fetchmany(size): 쿼리 결과에서 지정된 개수(size)만큼의 행을 리스트 형태로 가져옵니다. 커서의 위치를 지정된 개수만큼 이동시킵니다.
profile
AI/ML Engineer

0개의 댓글