PostgresSQL DB with FastAPI

neunghi·2022년 8월 11일
post-thumbnail

FastAPI 설치

기본적으로 FastAPI를 사용하기 위해서 필수 패키지를 설치합니다.

pip install alembic
pip install fastapi
# 추가로 서버 역할을 하는 uvicorn을 설치
pip install uvicorn

DB 생성

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 컨테이너가 생성됩니다.

src 구성파일 생성

  1. database.py
    database 파일을 연결합니다.
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()
  1. models.py
    실행할 동작파일 생성
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

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에서 확인 가능합니다.

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

profile
나는 능히 할 수 있는 버섯이다! 🍄‍🟫

0개의 댓글