Чтобы обеспечить некоторый контекст, я хочу написать код для подключения к базе данных MongoDB с помощью Motor . Моя идея состоит в том, чтобы создать одиночное соединение и использовать его во всех контроллерах, которым оно необходимо, посредством внедрения зависимостей, но я не совсем понимаю, как это сделать. Итак, позвольте мне показать вам простой пример кода, чтобы в двух словах проиллюстрировать эту идею:
database.py:
Код: Выделить всё
from motor.motor_asyncio import AsyncIOMotorClient, AsyncIOMotorDatabase
from dotenv import dotenv_values
class Database:
_client: AsyncIOMotorClient | None = None
_db: AsyncIOMotorDatabase | None = None
@staticmethod
def connect() -> None:
config = dotenv_values(".env")
Database._client = AsyncIOMotorClient(config["ATLAS_URI"])
Database._db = Database._client[config["DB_NAME"]]
@staticmethod
def close() -> None:
if Database._client is not None:
Database._client.close()
else:
raise ConnectionError("Client not connected")
@staticmethod
def get_db() -> AsyncIOMotorDatabase:
if Database._db is not None:
return Database._db
else:
raise ConnectionError("Database not connected")
Код: Выделить всё
from fastapi import FastAPI, Depends
import uvicorn
from database import Database
from contextlib import asynccontextmanager
from motor.motor_asyncio import AsyncIOMotorDatabase
@asynccontextmanager
async def lifespan(app: FastAPI):
Database.connect()
yield
Database.close()
app = FastAPI(lifespan=lifespan)
@app.get("/")
async def main(db: AsyncIOMotorDatabase = Depends(Database.get_db)):
await db["books"].insert_one({"hello": "world"})
return "Done"
if __name__ == "__main__":
uvicorn.run("main:app", reload=True)
Идея состоит в том, чтобы в будущем разделить код на модели, контроллеры и сервисы, чтобы создать лучший код. Однако текущий вопрос не об этом, поэтому я решил не приводить пример кода.
Мне хотелось бы знать, что вы думаете о моем решении. Есть ли способы улучшить его? Следую ли я лучшим практикам? Можете ли вы выявить какие-либо потенциальные проблемы? Любые предложения приветствуются. Если у вас есть другой подход, поделитесь им.
Большое спасибо за чтение

Подробнее здесь: https://stackoverflow.com/questions/785 ... in-fastapi