открываются обычным способом
@asynccontextmanager
async def initialize_session(
self,
) -> AsyncIterator[AsyncSession]:
async with self._session_maker() as session:
self._session = session
try:
yield session
except Exception:
await session.rollback()
raise
finally:
self._session = None
print("Finally")
Вместе, где это нужно, принт Finally отрабатывает, т.е сессия должна быть закрыта, но, при завершении скрипта, который шлет реквесты (веб сервер работает дальше) я вижу вот такую картину при вызове
select count(*) from pg_stat_activity; = 105
и все последующие реквесты упираются в лимит, я что-то не так делаю или не понимаю?(
А это метод у чего? Зачем тут self._session = session?
метод у класса, который работает с бд, не лучший вариант использования, но там будет что-то вроде этого class DBService(SQLAlchemyBase): def __init__(self) -> None: self._session = None def some_request(self) -> None: async with self.initialize_session(): return await self._session.scalar(Model) Прочел, что это дефолтное поведение алхимии, оно возвращает соединение в пул, но не закрывает его какое-то время, видимо, нужно это поведение как-то модифицировать
@asynccontextmanager async def async_session(self): # да и не понятно зачем вы контектсный менджер прям тут описали лучше вызвайте данную функцию в контекстном менджере и внутри мендежера запросы выполняйте async_session = self._async_session() try: yield async_session await async_session.commit() # комита у вас не хватает тоже except Exception as exc: await async_session.rollback() exc_msg = f'Ошибка сессии: {exc}' logging.error(exc_msg) raise finally: await async_session.close() #self._session = None плохая идея так делать закрывать надо имеющимися методами Ну и можно класс описать примерно такой для инициализации подключения к базе class Database: def __int__(self, db_url: str, echo: bool, application_name: str) -> None: self._engine = create_async_engine(db_url, echo=echo, future=True, connect_args={ 'server_settings': { 'application_name': application_name, }, }) self._async_session = sessionmaker( self._engine, expire_on_commit=False, autoflush=True, autocommit=False, class_=AsyncSession, )
Спасибо, но нужен ли комит в блоке файнад? На пил операции нет необхожимости
Марк✙, Вы увеличили карму Fred до 57.55 (+7.55)
пример зайды в консоль базы к примеру в psql и попробуй там изменить данные без комита)
Так, я про чтение больше, с записью это ясно
алхимия это декларативная орма явно надо прописывать, ведь явное лучше чем не явное 😉
Обсуждают сегодня