Python과 PostgreSQL을 연결하고, 오류까지 똑똑하게 처리하는 방법을 배워봅니다.
정의:
PostgreSQL(포스트그레스큐엘, 줄여서 Postgres)은 **오픈소스 관계형 데이터베이스 관리 시스템(RDBMS)**입니다.
하는 일:
데이터를 표(table) 형태로 저장하고, SQL이라는 언어를 사용해 데이터를 검색·추가·수정·삭제할 수 있게 해줍니다.
예시:
┌────────────┬──────────┐
│ name │ age │
├────────────┼──────────┤
│ Alice │ 25 │
│ Bob │ 32 │
└────────────┴──────────┘
특징:
정의:
psycopg2는 Python 코드에서 PostgreSQL 데이터베이스에 접속하고, SQL을 실행하고, 결과를 가져올 수 있게 해주는 라이브러리입니다.
역할:
간단한 예시:
import psycopg2
# 1. 데이터베이스 연결
conn = psycopg2.connect(
host="localhost",
dbname="mydb",
user="myuser",
password="mypassword"
)
cur = conn.cursor()
# 2. SQL 실행
cur.execute("SELECT * FROM users")
# 3. 결과 가져오기
rows = cur.fetchall()
print(rows)
conn.close()
정의:
psycopg2.errors
는 psycopg2 안에 들어 있는 오류 처리 전용 모듈입니다.
하는 일:
PostgreSQL이 보낸 오류 코드(SQLSTATE)를 이름이 있는 예외 클래스로 변환해 줍니다.
장점:
IntegrityError
등)과도 함께 사용 가능pgcode
PostgreSQL 오류는 SQLSTATE라는 5자리 문자열 코드로 구분됨
psycopg2 예외 객체의 .pgcode
속성에 저장
except psycopg2.OperationalError as e:
print(e.pgcode) # 예: '55P03'
PostgreSQL v9.1 ~ v15까지의 모든 오류를 클래스 형태로 제공
예:
22012
(division_by_zero) → 클래스: DivisionByZero
55P03
(lock_not_available) → 클래스: LockNotAvailable
새 예외 클래스는 기존 DB-API 예외를 상속받아 호환됨
except psycopg2.errors.UniqueViolation: # 더 구체적
...
except psycopg2.IntegrityError: # 상위 클래스
...
예전 방식 (오류 코드 비교)
try:
cur.execute("LOCK TABLE mytable IN ACCESS EXCLUSIVE MODE NOWAIT")
except psycopg2.OperationalError as e:
if e.pgcode == psycopg2.errorcodes.LOCK_NOT_AVAILABLE:
locked = True
새로운 방식 (클래스 직접 사용)
try:
cur.execute("LOCK TABLE mytable IN ACCESS EXCLUSIVE MODE NOWAIT")
except psycopg2.errors.LockNotAvailable:
locked = True
lookup
기능오류 코드를 예외 클래스로 변환해 주는 함수
psycopg2.errors.lookup("55P03")
# → <class 'psycopg2.errors.LockNotAvailable'>
응용 예:
try:
cur.execute("LOCK TABLE mytable IN ACCESS EXCLUSIVE MODE NOWAIT")
except psycopg2.errors.lookup("55P03"):
locked = True
[ PostgreSQL ]
│ (SQL 실행, 결과/오류 반환)
▼
[ psycopg2 ]
├─ 데이터베이스 연결
├─ SQL 실행
├─ 결과 조회
└─ 오류 처리
│
▼
[ psycopg2.errors ]
├─ PostgreSQL 오류 코드(SQLSTATE) → 예외 클래스 변환
├─ DB-API 호환
├─ 가독성 높은 예외 처리
└─ lookup()으로 코드 기반 예외 검색
💡 정리: