|  | 
| 2 | 2 | Database | 
| 3 | 3 | """ | 
| 4 | 4 | 
 | 
| 5 |  | -from typing import NoReturn, Self | 
|  | 5 | +from typing import Self | 
| 6 | 6 | 
 | 
| 7 | 7 | from sqlalchemy.ext.asyncio import (AsyncEngine, async_sessionmaker, | 
| 8 | 8 |  create_async_engine) | 
|  | 
| 15 | 15 | class Database: | 
| 16 | 16 |  _instance = None | 
| 17 | 17 | 
 | 
| 18 |  | - def __new__(cls, *args, **kwargs) -> Self: | 
|  | 18 | + def __new__(cls, *args, **kwargs) -> 'Database': | 
| 19 | 19 |  if cls._instance is None: | 
| 20 | 20 |  cls._instance = super(Database, cls).__new__(cls) | 
| 21 | 21 |  return cls._instance | 
| 22 | 22 | 
 | 
| 23 | 23 |  def __init__( | 
| 24 |  | - self, | 
| 25 |  | - engine: AsyncEngine | None = None, | 
| 26 |  | - session: AsyncSession | None = None, | 
|  | 24 | + self, | 
|  | 25 | + engine: AsyncEngine | None = None, | 
|  | 26 | + session: AsyncSession | None = None, | 
| 27 | 27 |  ) -> None: | 
| 28 | 28 |  if not hasattr(self, 'initialized'): | 
| 29 |  | - self.engine = engine | 
| 30 |  | - self.session = session | 
|  | 29 | + self.__engine = engine | 
|  | 30 | + self.__session = session | 
| 31 | 31 |  self.initialized = True | 
| 32 | 32 | 
 | 
| 33 |  | - async def __set_async_engine(self) -> NoReturn: | 
| 34 |  | - if self.engine is None: | 
| 35 |  | - self.engine = create_async_engine( | 
|  | 33 | + async def __set_async_engine(self) -> None: | 
|  | 34 | + if self.__engine is None: | 
|  | 35 | + self.__engine = create_async_engine( | 
| 36 | 36 |  settings.pg_dsn.unicode_string(), echo=False, future=True | 
| 37 | 37 |  ) | 
| 38 | 38 | 
 | 
| 39 |  | - async def __set_async_session(self) -> NoReturn: | 
| 40 |  | - if self.session is None: | 
| 41 |  | - self.session = async_sessionmaker( | 
|  | 39 | + async def __set_async_session(self) -> None: | 
|  | 40 | + if self.__session is None: | 
|  | 41 | + self.__session = async_sessionmaker( | 
| 42 | 42 |  autocommit=False, | 
| 43 | 43 |  autoflush=False, | 
| 44 |  | - bind=self.engine, | 
|  | 44 | + bind=self.__engine, | 
| 45 | 45 |  class_=AsyncSession, | 
| 46 | 46 |  expire_on_commit=False, | 
| 47 | 47 |  )() | 
| 48 | 48 | 
 | 
| 49 |  | - async def __set_repositories(self) -> NoReturn: | 
| 50 |  | - if self.session is not None: | 
| 51 |  | - self.user = repos.UserRepo(session=self.session) | 
|  | 49 | + async def __set_repositories(self) -> None: | 
|  | 50 | + if self.__session is not None: | 
|  | 51 | + self.user = repos.UserRepo(session=self.__session) | 
| 52 | 52 | 
 | 
| 53 | 53 |  async def __aenter__(self) -> Self: | 
| 54 | 54 |  await self.__set_async_engine() | 
| 55 | 55 |  await self.__set_async_session() | 
| 56 | 56 |  await self.__set_repositories() | 
| 57 | 57 |  return self | 
| 58 | 58 | 
 | 
| 59 |  | - async def __aexit__(self, exc_type, exc_value, traceback) -> NoReturn: | 
| 60 |  | - if self.session is not None: | 
| 61 |  | - await self.session.close() | 
|  | 59 | + async def __aexit__(self, exc_type, exc_value, traceback) -> None: | 
|  | 60 | + if self.__session is not None: | 
|  | 61 | + await self.__session.commit() | 
|  | 62 | + await self.__session.close() | 
|  | 63 | + self.__session = None | 
0 commit comments