- скопируйте папку
homework_04для этой домашки (Памятка: https://github.com/OtusTeam/BasePython/tree/homeworks-new) - используйте следующие пакеты:
- aiohttp
- SQLAlchemy>=1.4
- доработайте модуль
jsonplaceholder_requests:- установите значения в константы
USERS_DATA_URLиPOSTS_DATA_URL(ресурсы нужно взять отсюда https://jsonplaceholder.typicode.com/) - создайте асинхронные функции для выполнения запросов к данным ресурсам (используйте
aiohttp)- рекомендуется добавить базовые функции для запросов, которые будут переиспользованы (например
fetch_json)
- рекомендуется добавить базовые функции для запросов, которые будут переиспользованы (например
- установите значения в константы
- доработайте модуль
models:- создайте асинхронный алхимичный
engine(при помощиcreate_async_engine) - добавьте
declarative base - создайте объект
Sessionна основе классаAsyncSession - добавьте модели
UserиPost, объявите поля:- для модели
Userобязательными являютсяname,username,email - для модели
Postобязательными являютсяuser_id,title,body - создайте связи
relationshipмежду моделями:User.postsиPost.user
- для модели
- создайте асинхронный алхимичный
- доработайте модуль
main:- доработайте функцию main, по вызову которой будет выполняться полный цикл программы
(добавьте туда выполнение асинхронной функции
async_mainпри помощиasyncio.run):- создание таблиц (инициализация)
- загрузка пользователей и постов
- загрузка пользователей и постов должна выполняться конкурентно (параллельно)
при помощи
asyncio.gather - функции должны создавать новые объекты (например списки со словарями) и возвращать их как результат.
Например:
users_data: List[dict] posts_data: List[dict] users_data, posts_data = await asyncio.gather( fetch_users_data(), fetch_posts_data(), )
- полученные данные передавайте в следующие функции для создания записей в БД
-
Важно! Объекты нужно создавать пачками, а не по одному. То есть сначала добавляем в сессию всех юзеров, затем выполняем коммит. Также и с постами - создавайте алхимичные объекты, добавляйте в сессию, и только после этого выполняйте коммит.
Связь поста с юзером выполняется через установку
user_id, поэтому нет необходимости искать объект пользователя в БД перед созданием поста.
-
- никогда не используйте глобальные объекты для передачи данных между функциями
- никогда не мутируйте глобальные объекты внутри функций
- загрузка пользователей и постов должна выполняться конкурентно (параллельно)
при помощи
- добавление пользователей и постов в базу данных (используйте полученные из запроса данные, передайте их в функцию для добавления в БД)
- закрытие соединения с БД
- доработайте функцию main, по вызову которой будет выполняться полный цикл программы
(добавьте туда выполнение асинхронной функции
- добавьте новые зависимости в файл
requirements.txt- в корне проекта, а не в папке с домашкой - там они не будут обнаружены
- лучше добавьте зависимости вручную, но можно командой
pip freeze > requirements.txt, в таком случае обязательно проверьте, что туда попало, и удалите лишнее
- все запросы в сеть и БД выполняются асинхронно
- скрипт стягивает данные с API и складывает в БД
- объекты пользователей и постов добавляются в БД пачками, а не по одному
- созданы связи между пользователем и постом
- не происходит мутации глобальных объектов
- автоматический тест
test_homework_04проходит