Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 배우는 데이터베이스 읽기(READ) 작업: fetchone()과 fetchall() 완벽 정리

데이터베이스 읽기(READ) 작업이란?

데이터베이스의 읽기(READ) 작업이란 저장된 데이터 중에서 필요한 정보를 조회하여 가져오는 것을 의미합니다. 데이터베이스 연결이 성공적으로 설정되었다면, 이제 본격적으로 쿼리(query)를 실행할 준비가 된 것입니다.

Python에서는 fetchone() 메서드로 레코드 하나씩 가져올 수도 있고, fetchall() 메서드로 여러 개의 레코드를 한 번에 가져올 수도 있습니다.

주요 메서드와 속성

  • fetchone() — 쿼리 결과 집합(result set)에서 다음 행(row) 하나를 가져옵니다. 결과 집합은 커서(cursor) 객체로 테이블을 조회할 때 반환되는 객체입니다.
  • fetchall() — 결과 집합에 있는 모든 행을 가져옵니다. 만약 일부 행이 이미 추출된 상태라면, 남아 있는 나머지 행들을 반환합니다.
  • rowcount — 읽기 전용 속성으로, execute() 메서드 실행 후 영향을 받은 행의 개수를 반환합니다.

실전 예제

다음 예제는 EMPLOYEE 테이블에서 급여(INCOME)가 1000보다 큰 모든 레코드를 조회하는 과정을 보여줍니다.

#!/usr/bin/python
import MySQLdb

# 데이터베이스 연결 열기
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB")

# cursor() 메서드로 커서 객체 생성
cursor = db.cursor()

sql = "SELECT * FROM EMPLOYEE \
       WHERE INCOME > '%d'" % (1000)
try:
    # SQL 명령 실행
    cursor.execute(sql)
    # 모든 행을 리스트 형태로 가져오기
    results = cursor.fetchall()
    for row in results:
        fname = row[0]
        lname = row[1]
        age = row[2]
        sex = row[3]
        income = row[4]
        # 조회된 결과 출력
        print("fname=%s, lname=%s, age=%d, sex=%s, income=%d" % \
              (fname, lname, age, sex, income))
except:
    print("Error: unable to fetch data")

# 서버와 연결 종료
db.close()

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

fname=Mac, lname=Mohan, age=20, sex=M, income=2000

참고 사항

위 예제는 전통적인 MySQLdb 모듈(Python 2 스타일)을 기반으로 작성되었습니다. 최신 Python 3 환경에서는 mysql-connector-python 또는 PyMySQL 같은 라이브러리를 사용하는 것이 좋으며, 문법 자체는 거의 동일하기 때문에 위 코드를 그대로 응용할 수 있습니다. 또한 실무 환경에서는 SQL 인젝션 공격을 방지하기 위해 문자열 포매팅 대신 파라미터화된 쿼리(parameterized query)를 사용하는 것이 안전합니다.