sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDb med FastAPI

Jag tror att du redan har fått dina svar i frågeforumen för Fastapi-projektet på Github:Issue 452 (stängd). Men jag ska sammanfatta lösningarna här för framtida referens:

Kort sagt, du kan använda antingen motor eller mongomotor, Fastapi stöder båda och du kan återanvända ett globalt klientobjekt som har startat och avslutat med din appprocess.

Några kontextdetaljer för att (förhoppningsvis) klargöra dessa tekniker och deras relationer:

Den officiella MongoDB-drivrutinen för Python är pymongo. Under huven använder både MongoEngine och Motor Pymongo. Pymongo implementerar en direktklient för MongoDB (demoner) och erbjuder ett Python API för att göra förfrågningar.

Om du ville kunde du använda pymongo med Fastapi direkt. (På den SQL-sidan av saken, skulle detta vara likvärdigt med att använda psycopg2 i Flask direkt utan att gå igenom något som SQLAlchemy.)

MongoEngine är en ODM (Object-Document Mapper). Den erbjuder ett Python objektorienterat API som du kan använda i din applikation för att arbeta mer bekvämt och när det kommer till de faktiska DB-förfrågningarna kommer MongoEngine att använda pymongo.

Motor är ett omslag för pymongo som gör det icke-blockerande (tillåter asynkronisering/vänta). Den använder en event-loop, antingen genom Tornado eller genom asyncio. Om du använder Fastapi med uvicorn kommer uvicorn att implementera asynkronfunktion med uvloop. Kort sagt, genom att använda Motor med FastAPI, borde asynkron "bara fungera". Tyvärr implementerar Motor inte en ODM. I den meningen liknar den mer pymongo.

Fastapi hanterar förfrågningar från klienter (med Starlette), men det låter dig implementera din egen anslutning till MongoDB. Så du är inte begränsad till något särskilt val, utan du är mest på egen hand (a la Flask).

Du kan använda start-/avstängningskrokarna på din FastAPI-app för att starta/stoppa din Motor/MongoEngine-klient. Du behöver inte oroa dig för att ditt klientobjekt inte kvarstår på grund av problem med flera processer, eftersom Fastapi är entrådig.

@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

Ett exempel på implementering av motor med Fastapi kan hittas här.



  1. För att starta YCSB-laddning med klusteraktiverat alternativ för REDIS

  2. Hur man tar bort MongoDB-dokument genom att importera en fil

  3. Maskering av PII i MongoDB, Cassandra och Elasticsearch med DarkShield:...

  4. maxmemory parameter i redis.conf