3강: FastAPI와 PostgreSQL 연동하기
목차
- FastAPI 기본 개념 및 설치
- FastAPI와 PostgreSQL 연동 설정
- CRUD(Create, Read, Update, Delete) API 작성
- 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에 저장하는 방법을 학습하겠습니다.
'PostgreSQL' 카테고리의 다른 글
5강: FastAPI를 통한 웹 게시 (0) | 2024.05.29 |
---|---|
4강: 웹 크롤링 데이터 저장 (0) | 2024.05.29 |
2강: Python에서 PostgreSQL 사용하기 (0) | 2024.05.29 |
1강: PostgreSQL 기초 및 설치 (0) | 2024.05.29 |
[교안]PostgreSQL과 FastAPI를 활용한 웹 크롤링 학습 커리큘럼 (0) | 2024.05.29 |