PostgreSQL

3강: FastAPI와 PostgreSQL 연동하기

알세지 2024. 5. 29. 12:18

3강: FastAPI와 PostgreSQL 연동하기

목차

  1. FastAPI 기본 개념 및 설치
  2. FastAPI와 PostgreSQL 연동 설정
  3. CRUD(Create, Read, Update, Delete) API 작성
  4. Postman을 사용하여 API 테스트

1. FastAPI 기본 개념 및 설치

FastAPI는 빠르고 현대적인 웹 프레임워크로, Python 3.6+에서 사용 가능합니다. 비동기 지원, 자동 문서화 등의 기능을 제공합니다.

FastAPI 설치

FastAPI와 Uvicorn을 설치합니다.

pip install fastapi uvicorn

2. FastAPI와 PostgreSQL 연동 설정

SQLAlchemy와 Pydantic을 사용하여 FastAPI와 PostgreSQL을 연동합니다.

데이터베이스 모델 정의

SQLAlchemy를 사용하여 데이터베이스 모델을 정의합니다.

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# 데이터베이스 URL 설정
DATABASE_URL = "postgresql://yourusername:yourpassword@localhost/mydatabase"

# 데이터베이스 엔진 생성
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

# 사용자 테이블 정의
class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    email = Column(String, unique=True, index=True)

데이터베이스 연결 설정

FastAPI에서 데이터베이스 세션을 관리할 수 있도록 설정합니다.

from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session

app = FastAPI()

# 데이터베이스 세션 생성 함수
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

3. CRUD(Create, Read, Update, Delete) API 작성

FastAPI를 사용하여 CRUD 기능을 제공하는 API를 작성합니다.

데이터 생성 API

Pydantic을 사용하여 데이터 검증을 수행합니다.

from pydantic import BaseModel

# 사용자 생성 요청 모델
class UserCreate(BaseModel):
    name: str
    email: str

@app.post("/users/")
def create_user(user: UserCreate, db: Session = Depends(get_db)):
    db_user = User(name=user.name, email=user.email)
    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    return db_user

데이터 조회 API

사용자를 조회하는 API를 작성합니다.

@app.get("/users/")
def read_users(skip: int = 0, limit: int = 10, db: Session = Depends(get_db)):
    users = db.query(User).offset(skip).limit(limit).all()
    return users

데이터 업데이트 API

사용자 데이터를 업데이트하는 API를 작성합니다.

from pydantic import BaseModel

# 사용자 업데이트 요청 모델
class UserUpdate(BaseModel):
    name: str
    email: str

@app.put("/users/{user_id}")
def update_user(user_id: int, user: UserUpdate, db: Session = Depends(get_db)):
    db_user = db.query(User).filter(User.id == user_id).first()
    if db_user is None:
        raise HTTPException(status_code=404, detail="User not found")
    db_user.name = user.name
    db_user.email = user.email
    db.commit()
    db.refresh(db_user)
    return db_user

데이터 삭제 API

사용자 데이터를 삭제하는 API를 작성합니다.

@app.delete("/users/{user_id}")
def delete_user(user_id: int, db: Session = Depends(get_db)):
    db_user = db.query(User).filter(User.id == user_id).first()
    if db_user is None:
        raise HTTPException(status_code=404, detail="User not found")
    db.delete(db_user)
    db.commit()
    return {"message": "User deleted successfully"}

4. Postman을 사용하여 API 테스트

Postman을 사용하여 작성한 API를 테스트합니다. 각 엔드포인트를 호출하여 데이터 생성, 조회, 업데이트, 삭제를 확인합니다.

흔하게 발생하는 오류 및 해결 방법

  • 오류: HTTPException: User not found
    • 해결 방법: 요청한 사용자 ID가 데이터베이스에 존재하는지 확인하세요.
  • 오류: sqlalchemy.exc.IntegrityError: (psycopg2.errors.UniqueViolation) duplicate key value violates unique constraint "users_email_key"
    • 해결 방법: 이메일 주소가 고유해야 합니다. 중복된 이메일 주소를 사용하지 않도록 하세요.

마무리

FastAPI와 PostgreSQL을 연동하여 CRUD 기능을 제공하는 API를 작성했습니다. 다음 강의에서는 웹 크롤링 데이터를 PostgreSQL에 저장하는 방법을 학습하겠습니다.