{"id":18068424,"url":"https://github.com/Doonu/shoppe-fastapi","last_synced_at":"2025-03-28T12:30:59.800Z","repository":{"id":259690783,"uuid":"875025823","full_name":"Doonu/shoppe-fastapi","owner":"Doonu","description":"FastApi, REST API","archived":false,"fork":false,"pushed_at":"2025-01-14T19:23:55.000Z","size":298,"stargazers_count":0,"open_issues_count":4,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-06T22:15:05.818Z","etag":null,"topics":["fastapi"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Doonu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2024-10-18T23:35:48.000Z","updated_at":"2025-01-14T19:23:59.000Z","dependencies_parsed_at":"2024-10-27T11:35:44.808Z","dependency_job_id":"6e9686d5-fac2-465e-a438-5f665e969ba4","html_url":"https://github.com/Doonu/shoppe-fastapi","commit_stats":null,"previous_names":["doonu/backend_shoppe","doonu/shoppe-fastapi"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Doonu%2Fshoppe-fastapi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Doonu%2Fshoppe-fastapi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Doonu%2Fshoppe-fastapi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Doonu%2Fshoppe-fastapi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Doonu","download_url":"https://codeload.github.com/Doonu/shoppe-fastapi/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246030246,"owners_count":20712340,"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"],"created_at":"2024-10-31T08:06:25.819Z","updated_at":"2025-03-28T12:30:59.792Z","avatar_url":"https://github.com/Doonu.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"Создание сессий:\nhttps://gist.github.com/zmts/802dc9c3510d79fd40f9dc38a12bccfc\n\nЗапуск приложения:\n1) dev сборка - ```./run.sh```\n2) prod сборка - ```./run.sh prod```\n\nНастроить виртуальное окружения в PyCharm (File --\u003e Python Interpretator)\n\n1. Создание виртуального окружения\n```python -m venv venv```\n2. Активация вирутального окружения\n```.\\venv\\Scripts\\activate```\n3. Установка зависимостей\n```\n   pip install fastapi[all] \n   pip install sqlalchemy alembic psycopg2\n```\n В ходе установки добавлены следующие пакеты:\n- FastAPI и его основные зависимости: Starlette и Pydantic, которые обеспечивают маршрутизацию, обработку запросов и валидацию данных.\n- Дополнительные пакеты для FastAPI: FastAPI-CLI для командной строки, HTTPX для выполнения HTTP-запросов, Jinja2 для шаблонов HTML, Python-multipart для обработки файловых загрузок, и Uvicorn для запуска сервера ASGI.\n- Поддержка различных форматов данных и безопасности: PyYAML, UJSON, Orjson, и Email-validator.\n- Дополнительные пакеты для улучшения работы и разработки: Pydantic-settings и Pydantic-extra-types для расширенной конфигурации и типов, Typer для работы с CLI, а также Rich для вывода в консоль._\n\n----\nКонтроль версий `poetry`\n----\n1. ``` poetry init```\n2. Синхронизация между окружением и системой контроля зависимостей\n```poetry install --sync```\n\n----\nИспользование базы данных Postgres + Docker\n----\n- ```docker pull postgres```\n\nСоздание базы данных с именем todo-db и паролем - qwerty, порта для использования 5436\nПосле остановки контейнера - он удаляется \n- ```docker run --name=shopp_db -e POSTGRES_PASSWORD=\"qwerty\" -p 5436:5432 -d --rm postgres```\n\nПодключение к базе данных\n- ```docker ps``` (вытаскиваем id контейнер)\n- ```docker exec -it \u003cid Container\u003e /bin/bash``` (запускаем контейнер)\n- ```psql -U postgres```\n- ```\\d```\n\n-----------------------\nМиграции баз данных\n-----------------------\n\nИницализация миграции\n- ```alembic init migrations```\n\nСоздание ревизии\n- ```alembic revision --autogenerate -m \"Database creation\"```\n\nПовышение\n- ```alembic upgrade \u003chash из verions в переменной revision (head)\u003e``` \n\n----------------------\nДокументация\n----------------------\n\nОписание зависимостей:\n- ```FastAPI```: Основной фреймворк для создания API-приложений. В версии ^0.115.2 ты получаешь актуальные возможности по работе с асинхронностью,\nроутингом, валидацией данных через Pydantic и др.\n\n- ```Uvicorn```: Асинхронный сервер для запуска FastAPI. Ты используешь версию с extras=[\"standard\"],\nчто добавляет поддержку таких возможностей, как websockets и интеграция с различными протоколами.\n\n- ```SQLAlchemy```: ORM для работы с базами данных. Ты указал extras=[\"asynio\"],\nчтобы использовать асинхронные функции взаимодействия с базой данных.\n\n- ```Asyncpg```: Асинхронный драйвер для PostgreSQL. Он нужен для того, чтобы взаимодействовать с\nбазой данных PostgreSQL через асинхронные вызовы.\n\n- ```Pydantic-settings```: Инструмент для управления конфигурацией через Pydantic,\nчто позволяет удобно работать с настройками приложения.\n\n- ```Alembic```: Утилита для миграций базы данных. Она используется для управления схемой базы данных и выполнения версионирования.\nДля разработки:\n- ```Pytest```: Фреймворк для тестирования. Версия ^8.3.3 позволит тебе писать юнит-тесты и обеспечивать качество кода.\n- ```Black```: Инструмент для автоформатирования Python-кода, чтобы поддерживать единый стиль в проекте.\n\nОписание модулей и файлов:\n\nCORE:\n- config.py - Используется pydentic для управлния конфигурацией приложения через класс Settings\n1) api_v1_prefix: Префикс для версий API, по умолчанию /api/v1.\n2) db_url: URL для подключения к базе данных, использующий драйвер PostgreSQL и библиотеку asyncpg.\n3) echo: Параметр для логирования запросов в базу данных. Полезен для отладки, когда установлен в True.\n\n- base.py - Содержит базовый класс для моделей баз данных с использованием SQLAlchemy.\n1) Класс Base: Определен как абстрактный класс с автоматическим определением имени\nтаблицы через метод __tablename__. Атрибут id используется как первичный ключ.\n\n\n- db_helper.py (помощник для работы с базой данных) - в этом файле используется SQLAlchemy для асинхронного\nиспользования базы данных\n1) DatabaseHelper: Класс для управления подключением к базе данных. Он инициализирует асинхронный движок с помощью create_async_engine\nи создает сессии для работы с базой данных.\n2) create_async_engine - Метод для создания асинхронного движка базы данных\n3) async_sessionmaker - Создание фабрики\n4) get_scoped_session - Создание сессии с областью видимости (async_scoped_session)\n\n\n`Фабрика сессий` в `SQLAlchemy` — это способ стандартизировать создание сессий для работы с \nбазой данных. Она позволяет легко управлять жизненным циклом сессий, гарантируя, \nчто каждая сессия будет иметь правильную конфигурацию и привязку к нужному движку \n(или базе данных).\n\n```python\nself.session_factory = async_sessionmaker(  \n    bind=self.engine, autoflush=False, autocommit=False, expire_on_commit=False  \n)  # Создание фабрики для создания сессий через sessionmaker\n```\n\n- `bind`=self.engine:   \n    Этот параметр связывает фабрику с конкретным асинхронным движком базы данных, который был создан через create_async_engine. Это значит, что все сессии, созданные через эту фабрику, будут взаимодействовать с этой базой данных\n    \n- `autoflush`=False:  \n    Когда autoflush=True, SQLAlchemy автоматически отправляет изменения в базу данных перед выполнением любого SQL-запроса, если объект был изменён. Ты отключил это поведение, чтобы вручную управлять тем, когда данные должны быть отправлены в базу (например, при вызове session.commit()). Это полезно для оптимизации производительности, так как ты можешь избежать ненужной отправки данных.\n    \n- `autocommit`=False:  \n    Когда autocommit=True, SQLAlchemy будет автоматически завершать транзакции без необходимости явного вызова commit(). В твоем случае, ты отключил это поведение, что даёт тебе полный контроль над транзакциями. Ты должен вручную вызывать commit(), когда хочешь сохранить изменения, или rollback(), если нужно отменить транзакции.\n    \n- `expire_on_commit`=False:  \n    Обычно, когда вызывается session.commit(), все объекты в сессии становятся \"недействительными\" (их данные будут считаны снова из базы данных при следующем обращении). Установив этот параметр в False, ты оставляешь объекты \"актуальными\" после коммита, что может быть полезно, если ты не хочешь, чтобы данные пересчитывались сразу после сохранения.\n\n### Как работает фабрика?\n`Создание сессии`:  \n  \nКаждый раз, когда ты вызываешь self.session_factory(), фабрика создаёт новую сессию, привязанную к текущему движку (базе данных). Это асинхронная сессия, которая может использоваться в асинхронных функциях для выполнения запросов к базе данных.  \n\n`Использование сессии`:  \n  \n- Эта сессия предоставляет все возможности SQLAlchemy для управления транзакциями, запросами и обновлениями данных.  \n- Ты можешь использовать методы сессии, такие как add(), delete(), commit(), rollback(), и выполнять запросы к базе данных.  \n\n`Управление сессиями в FastAP`I:  \n  \nВ контексте FastAPI ты используешь эту фабрику для создания сессий, которые могут быть переданы в эндпоинты через зависимости. Например, ты можешь передавать сессию в функции с помощью Depends\n```python\nasync def get_items(db: AsyncSession = Depends(db_helper.session_dependency)):  \n\tresult = await db.execute(\"SELECT * FROM items\")  \n\titems = result.fetchall()  \n\treturn items\n```\n\n\n### Жизненный цикл сессии:  \n`Создание сессии`:  \nКогда функция FastAPI вызывает зависимость session_dependency, фабрика создаёт новую сессию, которая будет использоваться для обработки текущего запроса. \n\n`Выполнение запросов`:  \nВо время запроса сессия выполняет взаимодействие с базой данных (вставки, обновления, выборки и т.д.).  \n\n`Завершение запроса`:  \nКогда запрос завершён, FastAPI завершает работу сессией (либо коммитом, если все прошло успешно, либо откатом транзакции, если возникла ошибка).  \nПосле завершения запроса сессия закрывается, и все ресурсы освобождаются.\n\n### Методы\n`add`(): Используется для добавления одного объекта в сессию.  \n`add_all`(): Используется для добавления нескольких объектов в сессию.  \n`commit`(): Фиксирует все изменения, сделанные в сессии, сохраняя их в базе данных.  \n`rollback`(): Откатывает все изменения в текущей транзакции.  \n`close`(): Закрывает сессию, освобождая ресурсы.  \n`delete`(): Удаляет объект из базы данных.  \n`flush`(): Отправляет изменения в базу данных без завершения транзакции.  \n`expire`(): Помечает объект для обновления его данных при следующем обращении.  \n`refresh`(): Принудительно обновляет данные объекта из базы данных.  \n`execute`() и scalar(): Выполняет запрос и возвращает одно значение из результата.  \n`scalars`(): Возвращает несколько объектов из результата запроса.  \n`get`(): Возвращает объект по его первичному ключу.  \n`merge`(): Объединяет изменения объекта с объектом в текущей сессии.\n\n------------------------------\nСвязи между таблицами\n------------------------------\n\nshared:\nИспользуется mixin для обращение к таблице user (обернуть в этот класс и получить привязку к этой таблице)\n```\nclass UserRelationMixin:\n    _user_id_unique: bool = False\n    _user_back_populates: Optional[str] = None\n    _user_id_nullable: bool = False\n\n    @declared_attr\n    def user_id(cls) -\u003e Mapped[int]:\n        return mapped_column(\n            ForeignKey(\"user.id\"),\n            unique=cls._user_id_unique,\n            nullable=cls._user_id_nullable,\n        )\n\n    @declared_attr\n    def user(cls) -\u003e Mapped[\"User\"]:\n        return relationship(\"User\", back_populates=cls._user_back_populates)\n```\n\n1) Один ко многим\nОтношение «один ко многим» (One-to-Many) между таблицами в базе данных означает, что \nодна запись в одной таблице может быть связана с несколькими записями в другой таблице. \nНапример, один пользователь может иметь несколько постов - User и Post.\n\nuser.py\n```\n    posts: Mapped[list[\"Post\"]] = relationship(back_populates=\"user\")\n```\n\n2) Один к одному\nСвязь «один к одному» (One-to-One) в базе данных означает, что каждая запись в одной таблице может быть связана \nтолько с одной записью в другой таблице. Это полезно, когда ты хочешь разделить данные между двумя таблицами, но \nподдерживать уникальное соответствие между записями.\nuser.py и profile.py\n\nuser.py\n```\nprofile: Mapped[\"Profile\"] = relationship(back_populates=\"user\")\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FDoonu%2Fshoppe-fastapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FDoonu%2Fshoppe-fastapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FDoonu%2Fshoppe-fastapi/lists"}