MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDb mit FastAPI

Ich glaube, Sie haben Ihre Antworten bereits in den Issue-Foren des Fastapi-Projekts auf Github erhalten:Issue 452 (geschlossen). Aber ich werde die Lösungen hier zum späteren Nachschlagen zusammenfassen:

Kurz gesagt, Sie können entweder motor oder mongoengine verwenden, Fastapi unterstützt beides, und Sie können ein globales Client-Objekt wiederverwenden, das mit Ihrem App-Prozess gestartet und beendet wird.

Einige Kontextdetails, um (hoffentlich) diese Technologien und ihre Beziehungen zu verdeutlichen:

Der offizielle MongoDB-Treiber für Python ist pymongo. Unter der Haube verwenden sowohl MongoEngine als auch Motor Pymongo. Pymongo implementiert einen direkten Client für MongoDB (Daemons) und bietet eine Python-API, um Anfragen zu stellen.

Wenn Sie wollten, könnten Sie pymongo direkt mit Fastapi verwenden. (Auf der SQL-Seite wäre dies gleichbedeutend mit der direkten Verwendung von psycopg2 in Flask, ohne so etwas wie SQLAlchemy zu durchlaufen.)

MongoEngine ist ein ODM (Object-Document Mapper). Es bietet eine objektorientierte Python-API, die Sie in Ihrer Anwendung verwenden können, um bequemer zu arbeiten, und wenn es um die eigentlichen DB-Anfragen geht, verwendet MongoEngine pymongo.

Motor ist ein Wrapper für Pymongo, der es nicht blockierend macht (erlaubt async/await). Es verwendet eine Ereignisschleife, entweder durch Tornado oder durch asyncio. Wenn Sie Fastapi mit uvicorn verwenden, implementiert uvicorn die asynchrone Funktionalität mit uvloop. Kurz gesagt, bei Verwendung von Motor mit FastAPI sollte Async "einfach funktionieren". Leider implementiert Motor kein ODM. In diesem Sinne ist es Pymongo ähnlicher.

Fastapi verarbeitet die Anfragen von Clients (mithilfe von Starlette), aber Sie können damit Ihre eigene Verbindung zu MongoDB implementieren. Sie sind also nicht auf eine bestimmte Auswahl beschränkt, sondern meist auf sich allein gestellt (à la Flask).

Sie können die Startup/Shutdown-Hooks Ihrer FastAPI-App verwenden, um Ihren Motor/MongoEngine-Client zu starten/stoppen. Sie brauchen sich keine Sorgen zu machen, dass Ihr Client-Objekt aufgrund von Multiprozess-Problemen nicht bestehen bleibt, da Fastapi Single-Threaded ist.

@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

Eine Beispielimplementierung von motor mit Fastapi finden Sie hier.