FASTAPI 로 구현해보는 Vertical Slice Architecture - 2 (ORM, DB migration with prisma)

2023. 6. 5. 00:00Python/FASTAPI

반응형

지난 시간에 vertical slice architecture 의 기본 폴더 구조를 만들었다. 

https://yogingang.tistory.com/433

 

FASTAPI 로 구현해보는 Vertical Slice Architecture - 1 (mediator)

*이 강좌는 Python, Poetry, FASTAPI 에 대한 기본적인 지식이 있다고 가정합니다.* poetry 를 이용하여 project 를 만들어 보자 poetry new fastapi_vertical_slice 이제 해당 폴더로 이동하자 그리고 shell 을 통해 격

yogingang.tistory.com

이번 시간에는 DataBase 를 접근하는 orm package 및 db migration 을 지원하는 방법에 대해 알아보겠다. 

 

python 에서는 db 접근을 위한 몇가지 package 들이 있다. 

그중에서 node.js 진영에서 사용하는 prisma 가는 orm package 를 이용해 볼것이다. 

(prisma 에서 python 을 정식지원 하고 있지 않습니다. 참고 바랍니다.)

 

1. prisma 설치

poetry add prisma

2.  schema.prisma 와 .env 추가

3. schema.prisma

generator client {
  provider             = "prisma-client-py"
  interface            = "asyncio"
  recursive_type_depth = 5
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  name  String?
}

4. .env

DATABASE_URL="postgresql://유저이름:유저패스워드@localhost:5432/데이터베이스이름?schema=public"

** 패스워드에 특수문자가 들어가면 url encoding 해야 한다 아래 site 를 참고하자 **

https://www.w3schools.com/tags/ref_urlencode.ASP

 

HTML URL Encoding Reference

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

데이터베이스이름 같은 경우는 해당 이름으로 create database 를 통해 postgresql 에서 미리 db 를 생성해 놔야 한다.

그렇지 않으면 연결이 되지 않는다. (개인적인 생각으로는 create database 까지 처리 해줘야 할것 같은데.. 아쉬운 부분이다.)

 

visual studio code 에서 terminal --> new terminal 을 하자

schemas 폴더로 이동하자

아래 명령을 실행하자

prisma migrate dev --name init

그러면 연결된 database 에서 user 에 대해 table 이 생성된다. 

pqAdmin 을 통해 확인한 table 내역

 

이제 code 상에서 사용하기 위해 main.py 를 수정해 보자

main.py

from fastapi import FastAPI
from .features.hello import endpoints
from prisma import Prisma

app = FastAPI(title="FastAPI, vertical slice architecture")

app.include_router(endpoints.router)

db = Prisma()


@app.on_event("startup")
async def startup_event():
    await db.connect()
    print("Startup event")


@app.on_event("shutdown")
async def shutdown_event():
    await db.disconnect()
    print("Shutdown event")

 

이제 실행해 보자

uvicorn src.main:app --reload

 

create database 가 기본적으로 지원 되지 않는다. (제가 잘못 알고 있을수도 있습니다.)

그래서 creaste database 를 하는 python script 를 만든다.

일단 psycopg2 를 설치하자.

poetry add psycopg2

그리고 .env 파일을 읽어오는 env_manager.py 를 만들자. 위치는 src/shared/utility 밑에 만들자

env_manager.py

from pydantic import BaseSettings


class EnvSettings(BaseSettings):
    DATABASE_URL: str = ""

    class Config:
        env_file = ".env"

create_database.py

from urllib.parse import urlparse
from urllib import parse

import psycopg2
from src.shared.utility.env_manager import EnvSettings

envSettings = EnvSettings()
database_url = urlparse(envSettings.DATABASE_URL)
print(database_url)
dbname = database_url.path.removeprefix("/")
user = database_url.username
password = parse.unquote(database_url.password)
host = database_url.hostname
port = database_url.port

# establishing the connection
conn = psycopg2.connect(
    user=user, password=password, host=host, port=port
)
conn.autocommit = True

# Creating a cursor object using the cursor() method
cursor = conn.cursor()
cursor.execute(
    f"SELECT 1 FROM pg_catalog.pg_database WHERE datname = '{dbname}'")
exists = cursor.fetchone()
if not exists:
    sql = f"CREATE DATABASE {dbname}"
    # Creating a database
    cursor.execute(sql)
    print("Database created successfully........")
else:
    print("Database already exist........")

# Closing the connection
conn.close()

이제 처음에 uvicorn 으로 fastapi 를 실행할때 pre command 를 실행해서 해보자

python create_database.py & prisma migrate deploy & uvicorn src.main:app --reload

 

 

관련영상

https://youtu.be/NEggel7altk

 

 

반응형