Skip to content

Крупное обновление: Универсальное управление сессиями и реорганизация DAO

Latest
Compare
Choose a tag to compare
@Yakvenalex Yakvenalex released this 30 Oct 18:24
· 5 commits to main since this release

Релиз: Оптимизация и переработка системы сессий

Описание:
В данном релизе реализованы значительные улучшения в структуре и работе с сессиями для базы данных. Основные изменения связаны с переносом универсальных методов в новый модуль dao, реорганизацией пакетов, улучшением конфигурации и созданием нового универсального класса для управления сессиями.


Основные изменения:

1. Структура пакета dao

  • Универсальные методы перенесены в отдельный пакет dao, который теперь стал полноценным модулем. Структура dao выглядит следующим образом:
    • app/dao/__init__.py
    • app/dao/database.py — содержит базовый класс Base, упрощённые методы и модели базы данных.
    • app/dao/base.py — содержит базовый класс BaseDao, в котором прописаны универсальные методы для работы с таблицами базы данных.
    • app/dao/session_maker.py — новый файл для управления сессиями, поддерживающий FastAPI и Telegram ботов.

2. Новый класс DatabaseSessionManager

  • Реализован в app/dao/session_maker.py как универсальный класс для управления сессиями базы данных.
  • Основные возможности:
    • Управление сессиями как с использованием зависимостей FastAPI (Depends), так и в виде декораторов для более гибкого использования.
    • Поддержка транзакций: автоматический коммит и откат при ошибках.
    • Примеры использования:
      • Зависимость для FastAPI с поддержкой и без поддержки транзакций.
      • Декоратор для методов с возможностью настройки уровня изоляции транзакции и коммита, что может быть полезно в телеграм-ботах и других функциях.
# Использование зависимости FastAPI с транзакциями
@router.post("/register/")
async def register_user(user_data: SUserRegister, session: AsyncSession = TransactionSessionDep):
    # Логика эндпоинта
    pass

# Пример использования декоратора
@session_manager.connection(isolation_level="SERIALIZABLE", commit=True)
async def example_method(*args, session: AsyncSession, **kwargs):
    # Логика метода
    pass

3. Оптимизация и рефакторинг BaseDao в app/base.py

  • В BaseDao теперь используются только операции flush вместо commit, что повышает контроль над транзакциями и позволяет избежать избыточных коммитов.
  • Добавлены улучшенные универсальные методы для работы с объектами базы данных.

4. Обновление конфигурации app/config.py

  • Выделена переменная BASE_DIR для удобства доступа к базовым ресурсам проекта, включая базу данных SQLite.
  • Новая структура конфигурации позволяет получать доступ к переменным окружения независимо от места запуска.
import os
from pydantic_settings import BaseSettings, SettingsConfigDict

class Settings(BaseSettings):
    BASE_DIR: str = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
    DB_URL: str = f"sqlite+aiosqlite:///{BASE_DIR}/data/db.sqlite3"
    SECRET_KEY: str
    ALGORITHM: str

    model_config = SettingsConfigDict(env_file=f"{BASE_DIR}/.env")

settings = Settings()
database_url = settings.DB_URL

Преимущества обновления:

  • Упрощённое управление сессиями: Новая структура позволяет легко переключаться между сессиями с транзакциями и без них, в зависимости от контекста.
  • Гибкость: Универсальный класс DatabaseSessionManager предоставляет несколько способов использования, включая декораторы и зависимости, что делает его подходящим для разных проектов и целей.
  • Модульность и поддерживаемость: Перенос методов в dao делает код более организованным и лёгким для поддержки.

Изменения уже доступны в проекте и готовы к использованию.

Full Changelog: https://github.com/Yakvenalex/FastApiWithAuthSample/commits/v1.0.1