본문 바로가기
개발관련/FastAPI(BE)

FastAPI - (5) Model

by yjoo_ 2023. 10. 19.

드디어 지지난 시간동안 미뤄둔 Model 파트다.

뭘 미뤄뒀냐고? Body 파트에서 설명안하고 넘어간 Nested(중첩된) Model과

Field에 대한 내용들이다.

 

SQL인지 NOSQL인지 정해져있지 않은 마당에 설명하기 굉장히 어려울 것 같아 지나쳐 왔다.

하지만 이번 시간에 한번 다뤄보도록 하자.

https://fastapi.tiangolo.com/ko/tutorial/body-fields/

 

Body - Fields - FastAPI

FastAPI framework, high performance, easy to learn, fast to code, ready for production

fastapi.tiangolo.com

https://fastapi.tiangolo.com/ko/tutorial/body-nested-models/

 

Body - Nested Models - FastAPI

FastAPI framework, high performance, easy to learn, fast to code, ready for production

fastapi.tiangolo.com


자 지난번 파일에서 이어서 시작한다.

아직 보지 않았다면, https://yjoo-anywhere.tistory.com/20 보고와서 진행한다.

 

Model을 정의해볼 것이다.

먼저 models 디렉토리를 만들고 users.py를 만들어준다.

그리고 모델을 선언해볼 것이다.

지난번에 설명했던 대로 Model은 class로 선언된다.

 

SQLModel에서도 마찬가지로 class로 선언된다.

UserBase 클래스를 다음과 같이 선언할 수 있다.

from datetime import datetime
from sqlmodel import SQLModel

class UserBase(SQLModel):
	id: int
	email: str
	username: str
	last_login: datetime
	is_admin: bool

SQLModel 라이브러리는 Pydantic의 BaseModel과 같은 형태를 갖고있다.

 

선언 자체는 크게 다르지 않다. 하지만 이 모델을 DB Table로 사용하고 싶다면, 다음과 같이 추가해주어야 한다.

class UserBase(SQLModel, table=True):
	id: int
	email: str
	username: str
	last_login: datetime
	is_admin: bool

이 UserBase는 이 순간부터 데이터를 저장하는 테이블 구조를 정의한 것이 된다.

 

만약 하지만 이 모델은 기본 키외래 키같은 것이 지정되지 않았다.

 

또한 default값이나 max_length등 지정할 수 있는 것이 수없이 많다.

 

그걸 사용하는 방법이 바로 Field다.

 

Field의 사용방법은 다음과 같다.

 

from datetime import datetime
from sqlmodel import Field, SQLModel

class UserBase(SQLModel):
	email: str
	username: str
	last_login: datetime
	is_admin: bool

class User(UserBase, table=True):
	id: int = Field(default=None, primary_key=True)

편의 상 Field를 따로 지정할 class를 나눠서 사용했다.

 

이렇게 만들면 차후 자동으로 입력 될 구간을 (int형 기본 키가 auto_increment일 때 or 외래키 일 때)

 

제외하고 POST 요청 시 바로 Model을 가져다 사용할 수 있다.

 

사용할 수 있는 옵션이 많다.

request body의 metadata들을 관리할 땐 Field 클래스를 이용하면 된다.

 

이것이 Field 클래스다.

 

Nested Model

중첩된 모델이란 뜻인데, 무슨 소리냐면 특정 형태로 선언된 Model을 가져다가

 

새로운 Model의 특정 칼럼의 형태로 사용이 가능하다는 것이다.

 

코드로 예시를 들어주자면 이런거다.

 

from typing import List
from sqlmodel import Field, SQLModel

class UserBase(SQLModel):
	email: str
	username: str
	is_admin: bool
	items: List[str] = list()

class User(UserBase, table=True):
	id: int = Field(default=None, primary_key=True)

List는 또 하나의 자료구조다.

 

이런 식으로 str형 빈 리스트를 item 컬럼에 할당 할 수 있다.

 

우리가 만든 Model도 가능하지만, 내가 아는 방법은 Relationship이라는 외래 키 관계를 지정해주어야 한다.

 

이렇게 하기 귀찮다면 한번 NoSQL을 사용해보자. NoSQL의 경우 관계에 묶이지 않는다.

 

그래서 바로바로 Model구조를 넘겨서 사용할 수 있다.

 

만약 만든 모델을 바로 갖다붙여서 사용하려고 하면 이렇게 에러가 나게 된다.

 

그래서 Relationship으로 관계를 정의해준다.

 

한마디로 외래키 관계를 만드는거다.

 

외래키 관계를 만드는건 https://yjoo-anywhere.tistory.com/19

이 글에도 있으니 참고해보도록 하자.

 

[FastAPI + React] 소셜 로그인 구현 (4) - 플래너 구현하기

https://github.com/Jym-lab/React_FastAPI_planner GitHub - Jym-lab/React_FastAPI_planner: 리액트와 FastAPI 소셜로그인을 활용한 간단한 플래너 리액트와 FastAPI 소셜로그인을 활용한 간단한 플래너. Contribute to Jym-lab/Reac

yjoo-anywhere.tistory.com

from fastapi import Depends, FastAPI
from sqlmodel import select
from database.connetion import conn, get_session
from models.users import User

app = FastAPI()

@app.on_event("startup")
def on_startup():
	conn()

@app.get("/")
async def get_user(session=Depends(get_session)):
	return session.exec(select(User)).all();


if __name__ == "__main__":
	import uvicorn
	uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)

main.py를 다음과 같이 작성하면 DB 테이블이 생성되면서 조회가 가능하다.

 

 

'개발관련 > FastAPI(BE)' 카테고리의 다른 글

FastAPI - (4) DB 연결하기  (0) 2023.10.16
FastAPI - (3) Request Body  (0) 2023.10.10
FastAPI - (2) HTTP메소드, URL 매개변수  (1) 2023.10.07
FastAPI - (1) 개념 및 설치  (2) 2023.10.06