|
1 | | -# Работа с базами данных |
| 1 | +# Fastapi-Django |
| 2 | + |
| 3 | +Приложение, разрабатываемое при помощи это библиотеки: [https://github.com/albertalexandrov/fastapi-django-example](https://github.com/albertalexandrov/fastapi-django-example) |
| 4 | + |
| 5 | +Вспомогательная библиотека для разработки приложений на FastAPI. |
| 6 | + |
| 7 | +Реализует функционал для наиболее распространных ситуаций (создание экзмепляра приложения FastAPI по заданным настройкам, |
| 8 | +работа с БД, фильтрация, пагинация, авторизация, аутентификация). |
| 9 | + |
| 10 | +- [Названия библиотеки](#названия-библиотеки) |
| 11 | +- [TODO](#todo) |
| 12 | +- [Создание приложения](#создание-приложения) |
| 13 | +- [Запуск приложения](#запуск-приложения) |
| 14 | +- [Работа с БД](#работа-с-бд) |
| 15 | + - [Сессии SQLAlchemy](#сессии-sqlalchemy) |
| 16 | + - [Миграции](#миграции) |
| 17 | +- [Исследование имеющихся решений](#исследование-имеющихся-решений) |
| 18 | + - [fastapi-sqla](#fastapi-sqla) |
| 19 | + - [repository-sqlalchemy](#repository-sqlalchemy) |
| 20 | + - [FastAPI-SQLAlchemy](#fastapi-sqlalchemy) |
2 | 21 |
|
3 | 22 | ## Названия библиотеки |
4 | 23 |
|
@@ -75,6 +94,54 @@ python manage.py runserver |
75 | 94 |
|
76 | 95 | Это запустит экземпляр указанного в UVICORN_APP приложения при помощи uvicorn. |
77 | 96 |
|
| 97 | +## Работа с БД |
| 98 | + |
| 99 | +### Сессии SQLAlchemy |
| 100 | + |
| 101 | +Работа с базами данных происходит через слой репозиториев. Для этого разработан [базовый класс репозитория BaseRepository](fastapi_django/db/repositories/base.py#L13), |
| 102 | +который предоставляет возможность работать с данными в стиле Django ORM: |
| 103 | + |
| 104 | +```python |
| 105 | +from fastapi_django.db.repositories.base import BaseRepository |
| 106 | +from fastapi_django.db.sessions import contextified_autocommit_session |
| 107 | + |
| 108 | + |
| 109 | +class UsersRepository(BaseRepository): |
| 110 | + model_cls = User |
| 111 | + |
| 112 | + |
| 113 | +async with contextified_autocommit_session(): |
| 114 | + repository = UsersRepository() |
| 115 | + users = await repository.objects.filter(name="Иван").all() |
| 116 | +``` |
| 117 | + |
| 118 | +Обратите внимание, что сессия SQLAlchemy не передается при инициализации репозитория. Вместо этого она инициализируется |
| 119 | +контекстным менеджером contextified_autocommit_session() и помещается в ContextVars. Репозитории (все в пределах действия |
| 120 | +контекстного менеджера) затем берут инициализированную сессию оттуда. contextified_autocommit_session() также управляет |
| 121 | +жизненным циклом сессии. |
| 122 | + |
| 123 | +Настройки базы данных задаются в settings(.py) в DATABASE. Пример: |
| 124 | + |
| 125 | +```python |
| 126 | +DATABASE = { |
| 127 | + "DRIVERNAME": "postgresql+asyncpg", |
| 128 | + "DATABASE": "fastapi-django", |
| 129 | + "USERNAME": "postgres", |
| 130 | + "PASSWORD": "postgres", |
| 131 | + "HOST": "127.0.0.1", |
| 132 | + "PORT": "5433", |
| 133 | + "OPTIONS": { |
| 134 | + "echo": True |
| 135 | + }, |
| 136 | +} |
| 137 | +``` |
| 138 | + |
| 139 | +где OPTIONS - необязательные аргументы, которые будут переданы как kwargs в функцию create_async_engine(). |
| 140 | + |
| 141 | +### Миграции |
| 142 | + |
| 143 | +Работа с миграциями остается привычной - через консольную команду alembic. |
| 144 | + |
78 | 145 | ## Исследование имеющихся решений |
79 | 146 |
|
80 | 147 | [https://github.com/mjhea0/awesome-fastapi](https://github.com/mjhea0/awesome-fastapi) |
|
0 commit comments