{"id":25426745,"url":"https://github.com/noras2001/fastapi_sqlalchemy","last_synced_at":"2026-04-27T20:31:37.612Z","repository":{"id":277447994,"uuid":"932463351","full_name":"Noras2001/FastAPI_SQLAlchemy","owner":"Noras2001","description":"FastAPI app using SQLAlchemy","archived":false,"fork":false,"pushed_at":"2025-02-14T00:34:46.000Z","size":12,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-14T01:30:57.584Z","etag":null,"topics":["fastapi","sqlalchemy","swagger-ui"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Noras2001.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-14T00:27:25.000Z","updated_at":"2025-02-14T00:34:50.000Z","dependencies_parsed_at":"2025-02-14T01:31:22.777Z","dependency_job_id":"47ea7c98-c990-4925-8da2-cf35ba1dba35","html_url":"https://github.com/Noras2001/FastAPI_SQLAlchemy","commit_stats":null,"previous_names":["noras2001/fastapi_sqlalchemy"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Noras2001%2FFastAPI_SQLAlchemy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Noras2001%2FFastAPI_SQLAlchemy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Noras2001%2FFastAPI_SQLAlchemy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Noras2001%2FFastAPI_SQLAlchemy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Noras2001","download_url":"https://codeload.github.com/Noras2001/FastAPI_SQLAlchemy/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239214043,"owners_count":19601075,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fastapi","sqlalchemy","swagger-ui"],"created_at":"2025-02-17T00:21:39.812Z","updated_at":"2026-04-27T20:31:37.581Z","avatar_url":"https://github.com/Noras2001.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# README.md\n\n## Описание проекта\nЭто простое приложение на FastAPI, демонстрирующее основные возможности работы с SQLAlchemy. В рамках проекта реализованы следующие задачи:\n\n1. **Оптимизация загрузки данных**  \n   - Созданы модели `Author` и `Book` с отношением \"один ко многим\".\n   - Реализованы два эндпоинта для получения авторов:  \n     - **Ленивая загрузка**: при обращении к связанным книгам выполняется дополнительный запрос (N+1).\n     - **Жадная загрузка**: с использованием `joinedload` все данные загружаются одним SQL-запросом.\n   - **Вывод**: Использование жадной загрузки помогает избежать проблемы N+1 и повышает производительность при выборке связанных объектов.\n\n2. **Транзакции и откаты изменений**  \n   - Создана модель `User`.\n   - Эндпоинт демонстрирует транзакционное добавление двух пользователей с имитацией ошибки при добавлении третьего.\n   - При возникновении ошибки транзакция откатывается, и база данных остается в неизменном состоянии.\n   - **Вывод**: Использование транзакций с автоматическим откатом обеспечивает целостность данных при возникновении ошибок.\n\n3. **Работа с Alembic**  \n   - В проекте даны пошаговые инструкции по инициализации Alembic, созданию миграций для таблицы `Order`, внесению изменений (добавление поля `price`, удаление поля `created_at`) и последующему откату миграций.\n   - **Вывод**: Alembic облегчает управление версионностью схемы базы данных и позволяет легко вносить изменения в структуру таблиц.\n\n4. **Паттерн Repository**  \n   - Реализован паттерн Repository для модели `Book` с методами добавления книги, получения всех книг автора по его `id` и удаления книги.\n   - Использование фабрики сессий для управления соединениями с базой данных.\n   - **Вывод**: Паттерн Repository помогает инкапсулировать логику доступа к данным, делая код более читаемым и удобным для тестирования.\n\n5. **Логирование и объединение ORM и Core**  \n   - Логирование SQL-запросов включено с помощью параметра `echo=True` в `create_engine`, что позволяет отслеживать сгенерированные запросы.\n   - Реализован сложный агрегирующий запрос с использованием SQLAlchemy Core для подсчёта количества книг у каждого автора, в то время как ORM используется для большинства CRUD операций.\n   - **Вывод**: Комбинированное использование SQLAlchemy ORM и Core позволяет гибко работать с базой данных, используя преимущества обоих подходов для различных типов запросов.\n\n## Инструкции по запуску\n1. **Установка зависимостей**  \n   Установите необходимые пакеты:\n   ```bash\n   pip install fastapi uvicorn sqlalchemy pydantic\n   ```\n\n\n## **Тестирование эндпоинтов:**\n\n- Запустите приложение.\n    ```bash\n    uvicorn main:app --reload\n    ```\n**Swagger UI**\n\n   - Откройте браузер и перейдите по адресу [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).  \n     Здесь вы увидите интерактивную документацию FastAPI, где можно протестировать все созданные эндпоинты.\n     ![image](https://github.com/user-attachments/assets/1516e50b-191d-4012-bfed-13f0336f2f13)\n\n\n   - **Задача 1 (Ленивая и жадная загрузка):**  \n     - GET `/authors/lazy` – получаем авторов с ленивой загрузкой.  \n     - GET `/authors/eager` – получаем авторов с жадной загрузкой (joinedload).\n\n   - **Задача 2 (Транзакции и откат):**  \n     - POST `/users/transaction` – попробуйте создать пользователей; транзакция будет откатана из-за искусственной ошибки.\n\n   - **Задача 3 (Alembic):**  \n     - GET `/alembic/instructions` – ознакомьтесь с инструкциями по работе с Alembic в комментариях.\n\n   - **Задача 4 (Паттерн Repository для Book):**  \n     - POST `/books/add` – добавление новой книги. \n            ```\n            {\n            \"title\": \"Избранное\",\n            \"author_id\": 1\n            }\n            ```\n\n\n     - GET `/books/by_author/{author_id}` – получение книг по id автора.  \n         ```\n     [\n  {\n    \"id\": 1,\n    \"title\": \"Реквием\",\n    \"author_id\": 1\n  },\n  {\n    \"id\": 2,\n    \"title\": \"Поэма без героя\",\n    \"author_id\": 1\n    },\n    {\n    \"id\": 3,\n    \"title\": \"Избранное\",\n    \"author_id\": 1\n    }\n    ]\n        ```\n     - DELETE `/books/{book_id}` – удаление книги по id.\n\n   - **Задача 5 (Логирование и ORM+Core):**  \n     - GET `/authors/book_counts` – агрегирующий запрос с использованием SQLAlchemy Core, который возвращает количество книг у каждого автора.\n\n5. **Анализ SQL-запросов:**\n\n   Так как в `create_engine` установлен параметр `echo=True`, все сгенерированные SQL-запросы будут выводиться в консоль. Это позволит вам наблюдать за работой запросов, их оптимизацией (например, при использовании `joinedload`) и объединением ORM и Core.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoras2001%2Ffastapi_sqlalchemy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnoras2001%2Ffastapi_sqlalchemy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoras2001%2Ffastapi_sqlalchemy/lists"}