MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDb con FastAPI

Credo che tu abbia già ricevuto le tue risposte nei forum dei problemi del progetto Fastapi su Github:Issue 452 (chiuso). Ma ricapitolerò le soluzioni qui per riferimento futuro:

In breve, puoi utilizzare sia motore che mongoengine, Fastapi supporta entrambi e puoi riutilizzare un oggetto client globale che è stato avviato e terminato con il processo dell'app.

Alcuni dettagli contestuali per (si spera) chiarire queste tecnologie e le loro relazioni:

Il driver MongoDB ufficiale per Python è pymongo. Sotto il cofano, sia MongoEngine che Motor utilizzano Pymongo. Pymongo implementa un client diretto per MongoDB (daemon) e offre un'API Python per effettuare richieste.

Se lo desideri, puoi utilizzare direttamente pymongo con Fastapi. (Dal lato SQL delle cose, questo equivarrebbe a usare psycopg2 in Flask direttamente senza passare attraverso qualcosa come SQLAlchemy.)

MongoEngine è un ODM (Object-Document Mapper). Offre un'API Python orientata agli oggetti che puoi utilizzare nella tua applicazione per lavorare più comodamente e quando si tratta delle richieste DB effettive, MongoEngine utilizzerà pymongo.

Motor è un wrapper per pymongo che lo rende non bloccante (consentendo async/await). Utilizza un ciclo di eventi, tramite Tornado o tramite asyncio. Se stai usando Fastapi con uvicorn, uvicorn implementerà la funzionalità asincrona con uvloop. In breve, usando Motor con FastAPI, async dovrebbe "funzionare". Sfortunatamente, Motor non implementa un ODM. In questo senso è più simile a pymongo.

Fastapi gestisce le richieste dei client (usando Starlette), ma ti consentirà di implementare la tua connessione a MongoDB. Quindi non sei limitato a nessuna scelta particolare, ma sei principalmente da solo (a la Flask).

Puoi utilizzare gli hook di avvio/arresto della tua app FastAPI per avviare/arrestare il tuo client Motor/MongoEngine. Non devi preoccuparti che il tuo oggetto client non persista a causa di problemi multiprocesso, perché Fastapi è a thread singolo.

@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 esempio di implementazione del motore con Fastapi può essere trovato qui.