FastAPI(planner 코드리뷰 src.database.connection)
2025. 5. 2. 20:46ㆍ고급 웹프로그래밍
코드 리뷰
from motor.motor_asyncio import AsyncIOMotorClient
from beanie import init_beanie, Document
from src.models.events import Event,Eventupdate
from src.models.users import User
from src.config import settings
async def initialize_database(): # 데이터베이스 초기화
try:
client = AsyncIMotorClient(settings.DATABASE_URL) # 데이터베이스를 비동기적으로 사용
await init_beanie(
database= client.get_default_database(), # URL을 기반으로 데이터베이스 객체를 가져옴
documetn_models=[Event, User], # Event와 User라는 두 클래스를 컬렉션으로 등록 ( 이렇게 등록해야 Beanie로 await User.find_one(...)같은걸 사용할 수 있다
)
print("Database initialized successfully")
except Exception as e:
print(f"Error initializing database: {e}")
class Database:
def __init__(self,model : Document) -> None: # 클래스가 생성될 때 자동으로 model이라는 인자를 받고 저장하겠다
self.model = model # 받은 model 인자를 저장
async def save(self, document: Document):
await document.create() # DB에 저장, 이 작업이 다 끝나기 전에 다른일을 하지 않도록 await
return # None 반환
async def get_all(self) -> list:
docs = await self.model.find_all().to_list() # model의 모든 문서를 가져오고 리스트로 docs에 저장
return docs
async def delete(self, id:int):
doc = self.get(id)
await doc.delete()
async def get(self, id: int):
doc = await self.model.get(id)
return doc
async def update(self, id: int,body: EventUpdate):
doc = await self.model.get(id) # id에 해당하는 문서를 가져온다
body=body.model_dump() # EventUpdate 에서 정의한 객체를 딕셔너리 형태로 변환
body = {"$set": {k: v for k, v in body.items() if v is not None}} # 값이 비워져 있는 필드는 제외하고 수정
await doc.update(body) # 수정한 값을 데이터베이스에 업데이트
용어 의미
- AsyncIOMotorClient: MongoDB와 비동기로 통신할 수 있게 해주는 드라이버인 Motor에서, 실제로 데이터베이스에 연결할 때 사용하는 핵심 클래스
async def
함수 안에서await
를 사용해 MongoDB에 쿼리 요청을 보낼 수 있게 해줌
- init_beabie: Beanie ODM에서 MongoDB와 연결하고, 사용할 Document 모델들을 등록할 때 사용하는 초기화 함수
- MongoDB 연결 설정 + 어떤 모델을 사용할지 지정하는 작업 담당
- get-default_database(): MongoDB URL에서 지정된 기본 데이터베이스 이름에 해당하는 데이터베이스 객체를 가져온다
- find_all()은 해당 컬렉션의 모든 문서를 찾는 쿼리
- SQL로 치면: SELECT * FROM events
- to_list(): 결과를 리스트(list)로 바꿔주는 함수
- body.model_dump(): Pydantic 모델을 일반 딕셔너리로 변환하는 함수
- "$set" : 특정 필드 수정
반응형
'고급 웹프로그래밍' 카테고리의 다른 글
FastAPI(planner 코드리뷰 src.config) (0) | 2025.05.02 |
---|---|
FastAPI(planner 코드 리뷰 models.users) (0) | 2025.05.02 |
FastAPI(planner 코드 리뷰 models.events) (0) | 2025.05.02 |
FastAPI(planner 코드리뷰 src.routes.users) (0) | 2025.05.02 |
FastAPI(planner 코드리뷰 src.routes.events) (0) | 2025.05.02 |