GithubのFastapiプロジェクトのIssueForums:Issue 452(クローズ)ですでに回答を得ていると思います。ただし、今後の参考のために、ここでソリューションを要約します:
つまり、モーターまたはmongoengineのいずれかを使用でき、Fastapiは両方をサポートし、アプリプロセスで開始および終了したグローバルクライアントオブジェクトを再利用できます。
これらのテクノロジーとそれらの関係を(うまくいけば)明確にするためのコンテキストの詳細:
Python用の公式のMongoDBドライバーはpymongoです。内部では、MongoEngineとMotorの両方がPymongoを使用しています。 Pymongoは、MongoDB(デーモン)の直接クライアントを実装し、リクエストを行うためのPythonAPIを提供します。
必要に応じて、Fastapiでpymongoを直接使用できます。 (SQL側では、これはSQLAlchemyのようなものを経由せずにFlaskでpsycopg2を直接使用することと同じです。)
MongoEngineはODM(Object-Document Mapper)です。これは、アプリケーションでより快適に動作するために使用できるPythonオブジェクト指向APIを提供し、実際のDBリクエストに関しては、MongoEngineはpymongoを使用します。
Motorはpymongoのラッパーであり、非ブロッキング(async / awaitを許可)にします。 Tornadoまたはasyncioのいずれかを介してイベントループを使用します。 uvicornでFastapiを使用している場合、uvicornはuvloopで非同期機能を実装します。つまり、FastAPIでMotorを使用すると、非同期は「正常に機能する」はずです。残念ながら、モーターはODMを実装していません。この意味で、それはpymongoにもっと似ています。
Fastapiは(Starletteを使用して)クライアントからのリクエストを処理しますが、MongoDBへの独自の接続を実装できます。したがって、特定の選択肢に制限されることはありませんが、ほとんどの場合、自分で行うことができます(アラフラスコ)。
FastAPIアプリの起動/シャットダウンフックを使用して、Motor/MongoEngineクライアントを起動/停止できます。 Fastapiはシングルスレッドであるため、マルチプロセスの問題が原因でクライアントオブジェクトが永続化しないことを心配する必要はありません。
@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
Fastapiを使用したモーターの実装例はここにあります。