Wierzę, że masz już swoje odpowiedzi na forach dyskusyjnych projektu Fastapi na Github:Wydanie 452 (zamknięte). Ale podsumuję tutaj rozwiązania do wykorzystania w przyszłości:
Krótko mówiąc, możesz użyć silnika lub silnika mongo, Fastapi obsługuje oba i możesz ponownie użyć globalnego obiektu klienta, który został uruchomiony i zakończony w procesie aplikacji.
Niektóre szczegóły kontekstu, aby (miejmy nadzieję) wyjaśnić te technologie i ich relacje:
Oficjalnym sterownikiem MongoDB dla Pythona jest pymongo. Pod maskami zarówno MongoEngine, jak i Motor używają Pymongo. Pymongo implementuje bezpośredniego klienta dla MongoDB (demonów) i oferuje API Pythona do wykonywania żądań.
Jeśli chcesz, możesz użyć pymongo bezpośrednio z Fastapi. (Po stronie SQL byłoby to równoznaczne z użyciem psycopg2 bezpośrednio w Flask bez przechodzenia przez coś takiego jak SQLAlchemy.)
MongoEngine to ODM (ang. Object-Document Mapper). Oferuje zorientowane obiektowo API Pythona, którego możesz użyć w swojej aplikacji, aby pracować wygodniej, a jeśli chodzi o rzeczywiste żądania bazy danych, MongoEngine użyje pymongo.
Motor to wrapper dla pymongo, który sprawia, że nie blokuje się (umożliwia async/await). Używa pętli zdarzeń, albo przez Tornado, albo przez asyncio. Jeśli używasz Fastapi z uvicorn, uvicorn zaimplementuje funkcjonalność asynchroniczną z uvloop. Krótko mówiąc, używając Motor z FastAPI, asynchronia powinna "po prostu działać". Niestety, Motor nie implementuje ODM. W tym sensie jest bardziej podobny do pymongo.
Fastapi obsługuje żądania klientów (za pomocą Starlette), ale pozwoli Ci zaimplementować własne połączenie z MongoDB. Nie jesteś więc ograniczony do żadnego konkretnego wyboru, ale przeważnie jesteś sam (a la Flask).
Możesz użyć haków uruchamiania/wyłączania swojej aplikacji FastAPI, aby uruchomić/zatrzymać klienta Motor/MongoEngine. Nie musisz się martwić, że Twój obiekt klienta nie będzie utrzymywał się z powodu problemów z wieloma procesami, ponieważ Fastapi jest jednowątkowy.
@app.on_event("startup")
async def create_db_client():
# start client here and reuse in future requests
@app.on_event("shutdown")
async def shutdown_db_client():
# stop your client here
Przykładową implementację silnika z Fastapi można znaleźć tutaj.