From b1f7ccf1b45f1e3b16365746f186cbad8b61203c Mon Sep 17 00:00:00 2001 From: Alexander Kalinovsky Date: Sun, 18 May 2025 22:59:04 +0700 Subject: [PATCH] remove unnecessary logging --- src/quickbot/api_route/telegram.py | 8 +++----- src/quickbot/db/__init__.py | 31 +++--------------------------- src/quickbot/fsm/db_storage.py | 10 +++++----- src/quickbot/main.py | 11 ++--------- src/quickbot/model/__init__.py | 4 ++-- src/quickbot/model/settings.py | 6 +++--- 6 files changed, 18 insertions(+), 52 deletions(-) diff --git a/src/quickbot/api_route/telegram.py b/src/quickbot/api_route/telegram.py index 0135833..4758e2a 100644 --- a/src/quickbot/api_route/telegram.py +++ b/src/quickbot/api_route/telegram.py @@ -1,11 +1,9 @@ -from typing import Annotated -from fastapi import APIRouter, Request, Response, BackgroundTasks, Depends +from fastapi import APIRouter, Request, Response, BackgroundTasks from fastapi.datastructures import State -from sqlmodel.ext.asyncio.session import AsyncSession from ..main import QBotApp -from ..db import async_session, get_db +from ..db import async_session from aiogram.types import Update from logging import getLogger @@ -47,7 +45,7 @@ async def feed_bot_update( update: Update, app_state: State, ): - async with get_db() as db_session: + async with async_session() as db_session: await app.dp.feed_webhook_update( bot=app.bot, update=update, diff --git a/src/quickbot/db/__init__.py b/src/quickbot/db/__init__.py index a84f282..e2c0513 100644 --- a/src/quickbot/db/__init__.py +++ b/src/quickbot/db/__init__.py @@ -1,41 +1,16 @@ -from contextlib import asynccontextmanager -from logging import getLogger -from typing import AsyncGenerator from sqlmodel.ext.asyncio.session import AsyncSession from sqlalchemy.ext.asyncio import create_async_engine from sqlalchemy.orm import sessionmaker +from typing import AsyncGenerator from ..config import config -logger = getLogger(__name__) - -class TracedSession(AsyncSession): - def __del__(self): - logger.warning(f"💥 __del__ called — session was not properly closed! {id(self)}") - # This is a workaround for the issue with SQLAlchemy 2.0 - # where the session is not closed properly and __del__ is called - # when the session is garbage collected. - # This is not a good practice, but it is a workaround for now - # to avoid the session being closed too early. - - # You can also use the following line to print the stack trace - # to see where the session was created and not closed properly. - import traceback - traceback.print_stack() - - - async_engine = create_async_engine(config.DATABASE_URI, pool_size=20, max_overflow=60) async_session = sessionmaker[AsyncSession]( async_engine, class_=AsyncSession, expire_on_commit=False ) -@asynccontextmanager + async def get_db() -> AsyncGenerator[AsyncSession, None]: - session = async_session() - logger.warning(f"🟢 Session created: {id(session)}") - try: + async with async_session() as session: yield session - finally: - await session.close() - logger.warning(f"❌ Session closed: {id(session)}") diff --git a/src/quickbot/fsm/db_storage.py b/src/quickbot/fsm/db_storage.py index ea55cc8..ebc1bd2 100644 --- a/src/quickbot/fsm/db_storage.py +++ b/src/quickbot/fsm/db_storage.py @@ -10,7 +10,7 @@ from sqlmodel import select from typing import Any, Dict import ujson as json -from ..db import async_session, get_db +from ..db import async_session from ..model.fsm_storage import FSMStorage @@ -22,7 +22,7 @@ class DbStorage(BaseStorage): async def set_state(self, key: StorageKey, state: StateType = None) -> None: db_key = self.key_builder.build(key, "state") - async with get_db() as session: + async with async_session() as session: db_state = ( await session.exec(select(FSMStorage).where(FSMStorage.key == db_key)) ).first() @@ -44,7 +44,7 @@ class DbStorage(BaseStorage): async def get_state(self, key: StorageKey) -> str | None: db_key = self.key_builder.build(key, "state") - async with get_db() as session: + async with async_session() as session: db_state = ( await session.exec(select(FSMStorage).where(FSMStorage.key == db_key)) ).first() @@ -52,7 +52,7 @@ class DbStorage(BaseStorage): async def set_data(self, key: StorageKey, data: Dict[str, Any]) -> None: db_key = self.key_builder.build(key, "data") - async with get_db() as session: + async with async_session() as session: db_data = ( await session.exec(select(FSMStorage).where(FSMStorage.key == db_key)) ).first() @@ -74,7 +74,7 @@ class DbStorage(BaseStorage): async def get_data(self, key: StorageKey) -> Dict[str, Any]: db_key = self.key_builder.build(key, "data") - async with get_db() as session: + async with async_session() as session: db_data = ( await session.exec(select(FSMStorage).where(FSMStorage.key == db_key)) ).first() diff --git a/src/quickbot/main.py b/src/quickbot/main.py index f0e8f89..4561e91 100644 --- a/src/quickbot/main.py +++ b/src/quickbot/main.py @@ -19,7 +19,6 @@ from quickbot.utils.navigation import save_navigation_context from .config import Config from .bot.handlers.forms.entity_form import entity_item -from .db import get_db from .fsm.db_storage import DbStorage from .middleware.telegram import AuthMiddleware, I18nMiddleware from .model.bot_entity import BotEntity @@ -187,7 +186,7 @@ class QBotApp(Generic[UserType, ConfigType], FastAPI): user_id: int, entity: type[BotEntity] | str, entity_id: int, - db_session: AsyncSession = None, + db_session: AsyncSession, form_name: str = None, form_params: list[Any] = None, ): @@ -217,9 +216,6 @@ class QBotApp(Generic[UserType, ConfigType], FastAPI): ) await state.set_data(state_data) - if not db_session: - db_session = await get_db() - user = await self.user_class.get( session=db_session, id=user_id, @@ -244,7 +240,7 @@ class QBotApp(Generic[UserType, ConfigType], FastAPI): app_state: State, command: str, user_id: int, - db_session: AsyncSession = None, + db_session: AsyncSession, ): state = self.dp.fsm.get_context(bot=self.bot, chat_id=user_id, user_id=user_id) state_data = await state.get_data() @@ -255,9 +251,6 @@ class QBotApp(Generic[UserType, ConfigType], FastAPI): command_name = command.split("&")[0] cmd = self.bot_commands.get(command_name) - if not db_session: - db_session = await get_db() - user = await self.user_class.get( session=db_session, id=user_id, diff --git a/src/quickbot/model/__init__.py b/src/quickbot/model/__init__.py index 705928b..50ee14d 100644 --- a/src/quickbot/model/__init__.py +++ b/src/quickbot/model/__init__.py @@ -4,7 +4,7 @@ from sqlalchemy.orm.state import InstanceState from typing import cast from .bot_enum import BotEnum, EnumMember -from ..db import async_session, get_db +from ..db import async_session class EntityPermission(BotEnum): @@ -33,7 +33,7 @@ def session_dep(func): _session = state.async_session if not _session: - async with get_db() as session: + async with async_session() as session: kwargs["session"] = session return await func(cls, *args, **kwargs) else: diff --git a/src/quickbot/model/settings.py b/src/quickbot/model/settings.py index 96ecb77..cd8d26d 100644 --- a/src/quickbot/model/settings.py +++ b/src/quickbot/model/settings.py @@ -5,7 +5,7 @@ from sqlmodel import SQLModel, Field, select from sqlmodel.ext.asyncio.session import AsyncSession from typing import Any, get_args, get_origin -from ..db import async_session, get_db +from ..db import async_session from .role import RoleBase from .descriptors import FieldDescriptor, Setting from ..utils.serialization import deserialize, serialize @@ -205,7 +205,7 @@ class Settings(metaclass=SettingsMetaclass): if name not in cls._cache.keys(): if session is None: - async with get_db() as session: + async with async_session() as session: cls._cache[name] = await cls.load_param( session=session, param=param ) @@ -272,7 +272,7 @@ class Settings(metaclass=SettingsMetaclass): if isinstance(param, str): param = cls._settings_descriptors[param] ser_value = serialize(value, param) - async with get_db() as session: + async with async_session() as session: db_setting = ( await session.exec( select(DbSettings).where(DbSettings.name == param.field_name)