sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDb con FastAPI

Creo que ya obtuviste tus respuestas en los foros de problemas del proyecto Fastapi en Github:Problema 452 (cerrado). Pero recapitularé las soluciones aquí para futuras referencias:

En resumen, puede usar motor o mongoengine, Fastapi es compatible con ambos y puede reutilizar un objeto de cliente global que se inició y finalizó con el proceso de su aplicación.

Algunos detalles de contexto para (con suerte) aclarar estas tecnologías y sus relaciones:

El controlador oficial de MongoDB para Python es pymongo. Bajo el capó, tanto MongoEngine como Motor usan Pymongo. Pymongo implementa un cliente directo para MongoDB (daemons) y ofrece una API de Python para realizar solicitudes.

Si quisiera, podría usar pymongo con Fastapi directamente. (En el lado SQL de las cosas, esto sería equivalente a usar psycopg2 en Flask directamente sin pasar por algo como SQLAlchemy).

MongoEngine es un ODM (mapeador de objetos y documentos). Ofrece una API orientada a objetos de Python que puede usar en su aplicación para trabajar más cómodamente y cuando se trata de solicitudes de base de datos reales, MongoEngine usará pymongo.

Motor es un envoltorio para pymongo que hace que no bloquee (permitiendo asíncrono/espera). Utiliza un bucle de eventos, ya sea a través de Tornado o a través de asyncio. Si está utilizando Fastapi con uvicorn, uvicorn implementará la funcionalidad asíncrona con uvloop. En resumen, al usar Motor con FastAPI, async debería "simplemente funcionar". Desafortunadamente, Motor no implementa un ODM. En este sentido es más similar a pymongo.

Fastapi maneja las solicitudes de los clientes (usando Starlette), pero le permitirá implementar su propia conexión a MongoDB. Por lo tanto, no está restringido a ninguna opción en particular, sino que está mayormente solo (a la Flask).

Puede usar los ganchos de inicio/apagado de su aplicación FastAPI para iniciar/detener su cliente Motor/MongoEngine. No necesita preocuparse de que el objeto de su cliente no persista debido a problemas de multiproceso, porque Fastapi es de un solo subproceso.

@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

Puede encontrar un ejemplo de implementación de motor con Fastapi aquí.