Рекомендации по подключению MongoDB с помощью Motor в FastAPIPython

Программы на Python
Anonymous
Рекомендации по подключению MongoDB с помощью Motor в FastAPI

Сообщение Anonymous »

У меня вопрос: каковы наилучшие методы подключения к базе данных в FastAPI?
Чтобы обеспечить некоторый контекст, я хочу написать код для подключения к базе данных 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")

main.py:

Код: Выделить всё

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)

Как видите, у меня есть класс Database, предназначенный для управления подключением к базе данных. В main.py в функции lifespan мы запускаем подключение к базе данных MongoDB до того, как приложение начнет работать, и закрываем его, когда приложение останавливается. Наконец, в качестве примера, у нас есть небольшая конечная точка, которая получает экземпляр базы данных с помощью внедрения зависимостей и создает простой документ в коллекции под названием «книги».
Идея состоит в том, чтобы в будущем разделить код на модели, контроллеры и сервисы, чтобы создать лучший код. Однако текущий вопрос не об этом, поэтому я решил не приводить пример кода.
Мне хотелось бы знать, что вы думаете о моем решении. Есть ли способы улучшить его? Следую ли я лучшим практикам? Можете ли вы выявить какие-либо потенциальные проблемы? Любые предложения приветствуются. Если у вас есть другой подход, поделитесь им.
Большое спасибо за чтение :D

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

Вернуться в «Python»