MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDb avec FastAPI

Je crois que vous avez déjà eu vos réponses dans les forums du projet Fastapi sur Github :Issue 452 (closed). Mais je vais récapituler les solutions ici pour référence future :

En bref, vous pouvez utiliser motor ou mongoengine, Fastapi prend en charge les deux et vous pouvez réutiliser un objet client global démarré et terminé avec le processus de votre application.

Quelques détails de contexte pour (espérons-le) clarifier ces technologies et leurs relations :

Le pilote officiel MongoDB pour Python est pymongo. Sous les capots, MongoEngine et Motor utilisent Pymongo. Pymongo implémente un client direct pour MongoDB (démons) et propose une API Python pour faire des requêtes.

Si vous le souhaitez, vous pouvez utiliser directement pymongo avec Fastapi. (Du côté SQL, cela équivaudrait à utiliser directement psycopg2 dans Flask sans passer par quelque chose comme SQLAlchemy.)

MongoEngine est un ODM (Object-Document Mapper). Il offre une API Python orientée objet que vous pouvez utiliser dans votre application pour travailler plus confortablement et en ce qui concerne les requêtes DB réelles, MongoEngine utilisera pymongo.

Motor est un wrapper pour pymongo qui le rend non bloquant (permettant async/wait). Il utilise une boucle d'événements, soit via Tornado, soit via asyncio. Si vous utilisez Fastapi avec uvicorn, uvicorn implémentera la fonctionnalité asynchrone avec uvloop. En bref, en utilisant Motor avec FastAPI, async devrait "fonctionner tout simplement". Malheureusement, Motor n'implémente pas d'ODM. En ce sens, il ressemble plus à pymongo.

Fastapi gère les requêtes des clients (en utilisant Starlette), mais il vous permettra d'implémenter votre propre connexion à MongoDB. Vous n'êtes donc pas limité à un choix particulier, mais vous êtes la plupart du temps seul (à la Flask).

Vous pouvez utiliser les crochets de démarrage/arrêt de votre application FastAPI pour démarrer/arrêter votre client Motor/MongoEngine. Vous n'avez pas à vous soucier de la persistance de votre objet client en raison de problèmes multiprocessus, car Fastapi est monothread.

@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

Un exemple d'implémentation de moteur avec Fastapi peut être trouvé ici.