Programming/Project Log

[가계부 만들기] Backend - Database #1

minarae7 2023. 3. 9. 23:17
728x90
반응형

이제 본격적인 개발을 진행해볼 것이다. 본격적인 개발을 시작하면서 데이터를 실제로 저장할 데이터베이스를 연결해두어야 한다.

여기서는 app/databases 디렉토리를 생성하고 거기서 관련 코드를 넣을 계획이다.

개발은 vscode IDE를 사용하여서 진행할 것이다. uvicorn으로 프로그램을 실행하면 app 디렉토리 하단에 __pycache__라는 디렉토리가 생성된다. 이 디렉토리가 계속 생성되고 갱신되는데 개발에서 사용하는 디렉토리가 아니다보니 제법 신경이 쓰인다. 그리서 여기서는 해당 디렉토리를 보이지 않도록 처리한다.

backend 디렉토리에서 .vscode 라는 디렉토리는 생성하고 settings.json 파일을 생성한다. 이렇게 하고 나면 디렉토리 구조가 다음과 같아 진다.

settings.json 파일에 다음의 내용을 입력하면 __pycache__ 디렉토리가 파일 트리에서 사라지게 된다.

{
    "files.exclude": {
        "**/__pycache__": true
    }
}

이제 app 하단에 데이터베이스 관련 파일을 모으기 위한 디렉토리로 database를 생성하고 그 아래 __init__.py 파일을 넣어둔다. 그러면 다음과 같은 구조가 될 것이다.

이제 database 디렉토리 아래에 3개의 파일을 생성할 것이다. 각각은 다음과 같은 역할을 한다.

  • serects.json : Database 접속 정보를 저장
  • connection.py : 데이터베이스 접속과 관련된 내용을 작성
  • models.py : 테이블에 대한 스키마 정보를 작성
  • scheme.py : request/response에 대한 형식 내용을 작성

여기서는 데이터베이스로 mysql을 사용한다. 먼저 접속 정보를 입력한 json 파일을 생성한다.

{
    "DB": {
        "user": "user",
        "password": "password",
        "host": "localhost",
        "port": "3306",
        "database": "account_book"
    }
}

위의 파일에서는 데이터베이스 사용하는 정보를 채워넣으면 된다.

이제 connection.py 파일을 작성하겠다.

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
import json
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

SERECT_FILE = os.path.join(BASE_DIR, 'serects.json')
serects = json.loads(open(SERECT_FILE).read())
DB = serects["DB"]

DB_URL = f"mysql+pymysql://{DB['user']}:{DB['password']}@{DB['host']}/{DB['database']}?charset=utf8"

engine = create_engine(
    DB_URL, encoding = 'utf-8'
)

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

connection.py에서는 위에서 작성한 serects.json 파일을 읽어서 데이터베이스 접속 정보를 가져오고 이 정보를 통해서 데이터베이스 접속 URL을 만들둔다.

이제 정상적으로 접속이 되는지 확인하여야 한다.

먼저 mysql에 접속하기 위해서 필요한 패키지인 pymysql를 추가한다.

% poetry add pymysql
% pip install pymysql

원래는 위의 명령어만 입력하여서 설치가 되는데 가끔 패키지가 정상적으로 설치가 안되는 경우가 발생한다. 그런 경우에는 pip를 통해서 패키지를 설치하도록 한다.

이제 정상적으로 접속이 되는지 확인하도록 하겠다. app/main.py 파일을 아래 코드와 같이 수정한다.

from fastapi import FastAPI, Depends
from sqlalchemy.orm import Session
from .database.connection import get_db

app = FastAPI(title="account-book-api")

@app.get("/")
async def main(
    db: Session = Depends(get_db)
):
    return {"message": "Hello World"}

기존 코드에서 main이 호출될 때 파라미터로 db를 받도록 하였는데 이 때 자동으로 데이터베이스에 접속하여서 접속 Session을 넘겨주도록 하였고 현재는 프로그램에서 실제로 db 변수를 사용하지는 않는다. 그냥 정상적으로 데이터베이스 접속이 되는지만 확인하였다.

이제 프로그램을 재구동하여서 문제가 페이지가 정상적으로 출력되면 데이터베이스 접속이 정상적으로 이루어지는 것이다.

다음 포스팅에서는 앞에서 설계한 테이블들을 models.py 파일을 기술하고 이를 설명하도록 하겠다.

해당 글의 내용은 아래 사이트를 레퍼런스로 작성되었다.

 

Fastapi 사용법 mysql 연결, crud , 외부 api 연동

이번에, 운좋게 과제를 진행한 곳에서 fast-api 를 사용할 기회가 생겼다.개인적으로 진행하면서 너무 재밌게, 많은 공부가 된 것 같다.우선 패키지 관리를 poetry 로 하였는데 생각보다 어렵지 않다

velog.io

 

 

[FastAPI] 2. SQLAlchemy를 이용한 간단한 CRUD API 만들기

이번 글에서는 ORM에 대한 사용 방법에 대해 알아보도록 하겠습니다. ORM은 Object Relation Mapping의 약자로 객체를 이용해서 데이터베이스 Entity에 접근하는 방법입니다. 보통 애플리케이션 레벨에서

blog.neonkid.xyz

 

728x90
반응형