Файл local.yml настроен так, чтобы все работало из коробки. Однако такой подход делает локальную разработку неудобной, если не использовать удаленный интерпретатор.
docker compose -f ./local.yml up --build -d
Провести миграции:
docker compose -f ./local.yml run --rm backend alembic upgrade head
Полнять БД:
docker compose -f ./local.yml up postgres -d
Далее создаем виртуальное окружение, устанавливаем зависимости:
pip install -r requirements-dev.txt
Убеждаемся, что переменная окружения DB_HOST
имеет значение localhost
. В /app/core/config.py
она имеет такое значение
по умолчанию, но ее значение берется из файла .env
Для проведения миграций необходимо выполнить 4 действия:
-
Импортировать модель в
__init__py
модуляmodels
, чтобы alembic видел эту модель и провел миграцию создания модели -
Создать папку
versions
в папкеalembic
-
Создать миграцию:
docker compose -f ./local.yml run --rm backend alembic revision --autogenerate -m "name" --rev-id "001"
-
Провести миграцию
docker compose -f ./local.yml run --rm backend alembic upgrade head
где backend
- это имя сервиса
- Создать репозиторий для модели
- Создать UnitOfWork для домена
- Создать сервис для домена и реализацию методов
- Создать зависимость для получения сервиса
class DomainRepository(SQLAlchemyRepository):
model = DomainModel
class DomainUnitOfWork(SQLAlchemyUnitOfWork):
def __init__(self):
super().__init__()
self.domain_repository = DomainRepository
class DomainService:
def __init__(self):
self.uow = DomainUnitOfWork()
async def get_all_records(self):
async with self.uow:
return await self.uow.domain_repository.list()
def get_domain_service() -> DomainService:
return DomainService()
DomainServiceDep = Annotated[DomainService, Depends(get_domain_service)]
Создание связки репозиторий - uow - сервис для каждого домена в отдельности позволяет изолировать все, что связано с этим доменом внутри одного модуля, а также изолировать всю бизнес-логику в сервисах
@router("/")
async def test(domain_service: DomainServiceDep):
await domain_service.do_smth()
- http://127.0.0.1:8000/docs - документация API
- на порту
5432
доступна БД postgres