
기본적으로 FastAPI를 사용하기 위해서 필수 패키지를 설치합니다.
pip install alembic
pip install fastapi
# 추가로 서버 역할을 하는 uvicorn을 설치
pip install uvicorn
db 생성을 위해 프로젝트 최상위에 Makefile을 생성합니다.
run-db:
docker run --name jem_postgres -p 5432:5432 -e POSTGRES_PASSWORD=1234 -e POSTGRES_DB=jembox -v ${PWD}/db_data:/var/lib/postgresql/data -d postgres:14.1
비밀번호와 -v 볼륨위치, --name db명은 자유롭게 수정하셔도됩니다.
생성 후 실행합니다.
make run-db
이렇게하면 postgres db 컨테이너가 생성됩니다.
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
SQLALCHEMY_DATABASE_URL = "postgresql://postgres:비밀번호@localhost/db명"
engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
def get_db():
db = SessionLocal()
try:
yield db
except:
db.close()
from sqlalchemy import Integer, String
from sqlalchemy.sql.schema import Column
from .database import Base
class Job(Base):
__tablename__ = 'jobs'
id = Column(Integer, primary_key=True)
title = Column(String, nullable=False)
description = Column(String, nullable=False)
alembic은 DB 마이그레이션 버전관리를 도와줍니다.

모든 마이그레이션 alembic 스크립트에 의해 진행됩니다.
다음 명령어로 마이그레이션 폴더를 생성해줍니다.
alembic init alembic
그러면 최상단에 alembic 폴더가 생성됩니다.
우선 최상단에 있는 alembic.ini 파일을 열어 58번째 줄에 연동할 db url을 본인의 db url로 변경합니다.
sqlalchemy.url = 본인 postgressql db url
alembic/versions 폴더 안에 난수_init.py 파일을 열어서 기본 세팅을 해줍니다.
먼저 우리가 필요한 테이블 생성과 이후 삭제할 함수를 다음처럼 수정하겠습니다.
def upgrade():
# 테이블 생성
op.create_table(
'jobs',
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('title', sa.String, nullable=False),
sa.Column('description', sa.String, nullable=False)
)
def downgrade():
# 테이블 삭제
op.drop_table('jobs')
변경사항을 적용합니다.
alembic upgrade head
만일 여기서 에러가 나는 분들은 다음 과정을 따라해주세요
brew install postgresql pip3 install psycopg2-binary
실행할 동작을 main.py에 작성합니다.
from fastapi import FastAPI, Depends
from sqlalchemy.orm import Session
from .schemas import CreateJobRequest
from .database import get_db
from .models import Job
app = FastAPI()
@app.post("/")
def create(details: CreateJobRequest, db: Session = Depends(get_db)):
to_create = Job(
title=details.title,
description=details.description
)
db.add(to_create)
db.commit()
return {
"success": True,
"created_id": to_create.id
}
@app.get("/")
def get_by_id(id: int, db: Session = Depends(get_db)):
return db.query(Job).filter(Job.id == id).first()
@app.delete("/")
def delete(id: int, db: Session = Depends(get_db)):
db.query(Job).filter(Job.id == id).delete()
db.commit()
return { "success": True }
rest를 날려서 잘 통신이 되는지 확인해봅시다.
우선 FastAPI 서버를 실행합니다.
uvicorn src.main:app --reload
Hit the POST endpoint with cURL:
curl --request POST --data '{"title": "my first job", "description": "an awesome job"}' localhost:8000
Hit the GET endpoint:
curl --request GET "localhost:8000?id=1"
Hit the DELETE endpoint:
curl --request DELETE "localhost:8000?id=1&"
위를 따라했다면 위 정보를 http://127.0.0.1:8000/docs에서 확인 가능합니다.

모든 소스코드는 저의 깃헙레포에서 확인가능합니다.