Skip to content

Repository files navigation

README

Запустить приложение

Поднять backend с помощью docker

Файл local.yml настроен так, чтобы все работало из коробки. Однако такой подход делает локальную разработку неудобной, если не использовать удаленный интерпретатор.

docker compose -f ./local.yml up --build -d

Провести миграции:

docker compose -f ./local.yml run --rm backend alembic upgrade head

Поднять backend локально

Полнять БД:

docker compose -f ./local.yml up postgres -d

Далее создаем виртуальное окружение, устанавливаем зависимости:

pip install -r requirements-dev.txt

Убеждаемся, что переменная окружения DB_HOST имеет значение localhost. В /app/core/config.py она имеет такое значение по умолчанию, но ее значение берется из файла .env

Создание моделей

Для проведения миграций необходимо выполнить 4 действия:

  1. Импортировать модель в __init__py модуля models, чтобы alembic видел эту модель и провел миграцию создания модели

  2. Создать папку versions в папке alembic

  3. Создать миграцию:

    docker compose -f ./local.yml run --rm backend alembic revision --autogenerate -m "name" --rev-id "001"
  4. Провести миграцию

    docker compose -f ./local.yml run --rm backend alembic upgrade head

где backend - это имя сервиса

Пример использования сервиса для модели в рамках DDD

  1. Создать репозиторий для модели
  2. Создать UnitOfWork для домена
  3. Создать сервис для домена и реализацию методов
  4. Создать зависимость для получения сервиса
classDomainRepository(SQLAlchemyRepository):
model=DomainModelclassDomainUnitOfWork(SQLAlchemyUnitOfWork):
def__init__(self):
super().__init__()
self.domain_repository=DomainRepositoryclassDomainService:
def__init__(self):
self.uow=DomainUnitOfWork()
asyncdefget_all_records(self):
asyncwithself.uow:
returnawaitself.uow.domain_repository.list()
defget_domain_service() ->DomainService:
returnDomainService()
DomainServiceDep=Annotated[DomainService, Depends(get_domain_service)]

Создание связки репозиторий - uow - сервис для каждого домена в отдельности позволяет изолировать все, что связано с этим доменом внутри одного модуля, а также изолировать всю бизнес-логику в сервисах

Пример использования

@router("/")asyncdeftest(domain_service: DomainServiceDep):
awaitdomain_service.do_smth()

Сервисы

Links

About

Template for FastAPI projects

Resources

Stars

18 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages