데이터베이스 읽기(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)를 사용하는 것이 안전합니다.