2023. 6. 5. 00:00ㆍPython/FASTAPI
지난 시간에 vertical slice architecture 의 기본 폴더 구조를 만들었다.
https://yogingang.tistory.com/433
이번 시간에는 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
데이터베이스이름 같은 경우는 해당 이름으로 create database 를 통해 postgresql 에서 미리 db 를 생성해 놔야 한다.
그렇지 않으면 연결이 되지 않는다. (개인적인 생각으로는 create database 까지 처리 해줘야 할것 같은데.. 아쉬운 부분이다.)
visual studio code 에서 terminal --> new terminal 을 하자
schemas 폴더로 이동하자
아래 명령을 실행하자
prisma migrate dev --name init
그러면 연결된 database 에서 user 에 대해 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
관련영상