[FastAPI, MongoDB] No default database name defined or provided 버그 수정

sonsazang

·

2023. 6. 7. 20:56

서론

파이썬 FastAPI 공부를 위해 [ FastAPI를 사용한 파이썬 웹 개발 / 한빛미디어 ] 책을 통해 진행하던 중에 Chapter6. 데이터베이스 연결 부분에서 NoSQL인 MongoDB를 연결하는 부분에서 발생하게 된 버그입니다.

구글링을 통해서 정보를 얻어보려고 했으나 생각보다 양질의 정보를 찾지 못해서 해결 후 정리하게 되는 글입니다.


테스트 진행 버전

python 3.10.2 64-bit
mongod v5.0.8

beanie 1.13.1

문제

책에서 제공해 주는 예제를 보면서 진행하게 되다 발생하게 된 에러입니다.
await init_beanie(database=client.get_default_database(), document_models=[Event, User]) 부분에서 발생하게 되었으며 GPT를 통해서 알게 된 정보로는 "MongoDB의 기본 데이터베이스 이름이 정의되지 않았거나 제공되지 않았을 때 발생합니다"라고 알려주었습니다.
그러고 나서 FastAPI와 MongoDB를 연동하기 위해 기본 데이터베이스 이름을 설정해야 합니다. AsyncIOMotorClient 인스턴스를 만들 때 database 매개변수를 통해 데이터베이스 이름을 지정할 수 있습니다.라고 정리를 해주면서 해결 방식을 알려주었습니다. 

 

가장 중요한 부분은 기본 데이터베이스 이름을 설정하는 부분입니다.

위에서 알게 된 정보로 두 가지의 해결 방안을 제시할 생각입니다.

 

해결방안

첫 번째 해결방안 - GPT3.5가 알려준 해결 방안입니다. (추천)

위에서 문제가 되었던 부분인 데이터베이스 이름을 따로 설정해 주어서 쉽게 해결하는 모습을 볼 수 있습니다. 

위 방식으로 진행하면 self.DATABASE_NAME 부분을 통해 데이터베이스의 이름이 설정되어서 에러가 해결되는 것을 확인할 수 있습니다. 

다음은 위 부분에서 사용한 AsyncIOMotorClient() 메서드를 제공하는 Motor (Async MongoDB 드라이버) 공식 문서에 있는 2.0 마이그레이션 가이드 부분에 있는 방식을 통해서 진행할 생각입니다.

 

두 번째 해결방안 - Motor 공식 문서에 있는 마이그레이션 가이드를 통해 알아낸 방법

해당 가이드를 보면 알 수 있는 것처럼 MotorClient.get_database()를 사용해서 이름을 데이터베이스 이름을 호출하라고 알려주고 있습니다.

그래서 다음은 위와 같은 방법을 적용한 해결 방법입니다.

 

결론

두 방법 중에 어떤 방법을 택하던지 상관은 없이 기능적으로 잘 동작합니다. (2023-06-07 확인 완료) 
문제가 발생된 원인은 책에서 알려주고 있는 beanie 라이브러리는 1.13.1 버전을 사용하라고 명시하고 있는데 아마 이 부분 말고도 다른 부분에서도 버전이 변경되면서 발생하게 된 현상 같습니다.

다만 아직 정보가 잘 나오지 않는 느낌의 버그여서 저와 같이 처음 경험하는 분들에게 도움이 되고자 작성하게 된 글입니다.

감사합니다.