Python으로 데이터베이스를 다루다 보면 다양한 원인으로 오류가 발생할 수 있습니다. 대표적인 예로는 실행된 SQL 문의 구문 오류, 데이터베이스 연결 실패, 그리고 이미 취소되었거나 종료된 statement 핸들에 대해 fetch 메서드를 호출하는 경우 등이 있습니다.
DB API가 정의하는 표준 예외 클래스
Python DB API는 모든 데이터베이스 모듈이 반드시 포함해야 하는 표준 예외(Exception)들을 정의하고 있습니다. 아래 표를 통해 각 예외 클래스의 역할과 상속 관계를 확인할 수 있습니다.
| 번호 | 예외 클래스 및 설명 |
|---|---|
| 1 | Warning 치명적이지 않은(non-fatal) 문제에 사용됩니다. StandardError를 상속해야 합니다. |
| 2 | Error 모든 오류의 기본 클래스(Base Class)입니다. StandardError를 상속해야 합니다. |
| 3 | InterfaceError 데이터베이스 자체가 아닌, 데이터베이스 모듈에서 발생하는 오류에 사용됩니다. Error를 상속해야 합니다. |
| 4 | DatabaseError 데이터베이스 내부에서 발생하는 오류에 사용됩니다. Error를 상속해야 합니다. |
| 5 | DataError DatabaseError의 하위 클래스로, 데이터 자체와 관련된 오류를 나타냅니다. |
| 6 | OperationalError DatabaseError의 하위 클래스로, 데이터베이스 연결 끊김과 같은 오류를 의미합니다. 이러한 오류는 대체로 Python 개발자가 통제할 수 없는 외부 요인에서 비롯됩니다. |
| 7 | IntegrityError DatabaseError의 하위 클래스로, 고유성(Unique) 제약 조건 위반이나 외래 키(Foreign Key) 문제처럼 관계형 무결성을 해칠 수 있는 상황에서 발생합니다. |
| 8 | InternalError DatabaseError의 하위 클래스로, 더 이상 활성화되지 않은 커서(Cursor) 사용처럼 데이터베이스 모듈 내부의 오류를 나타냅니다. |
| 9 | ProgrammingError DatabaseError의 하위 클래스로, 잘못된 테이블 이름 사용 등 명백히 개발자 측의 실수로 볼 수 있는 오류를 의미합니다. |
| 10 | NotSupportedError DatabaseError의 하위 클래스로, 지원하지 않는 기능을 호출하려 할 때 발생합니다. |
예외 처리 기본 예제
실제 코드에서는 try-except 블록을 활용해 이러한 예외를 처리하는 것이 좋습니다.
import MySQLdb
try:
db = MySQLdb.connect(host="localhost", user="user", passwd="password", db="test")
cursor = db.cursor()
cursor.execute("SELECT * FROM users")
results = cursor.fetchall()
except MySQLdb.Error as e:
print("데이터베이스 오류 발생:", e)
finally:
if 'db' in dir():
db.close()활용 시 주의사항
작성하는 Python 스크립트는 반드시 위에서 소개한 오류들을 적절히 처리(handle)해야 합니다. 다만 각 예외를 사용하기 전에, 현재 사용 중인 MySQLdb 모듈이 해당 예외를 실제로 지원하는지 먼저 확인해야 합니다.
각 예외 클래스에 대한 더 자세한 정보가 필요하다면 DB API 2.0 명세(Specification) 문서를 참고하는 것을 권장합니다.